鱼C论坛

 找回密码
 立即注册
查看: 1763|回复: 9

结构体

[复制链接]
发表于 2021-11-8 16:41:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 林江楠 于 2021-11-8 19:50 编辑
#include <stdio.h>
#include <stdlib.h>

struct Date
{
        int year;
        int month;
        int day;
};

struct Book
{
        char title[128];
        char author[40];
        float price[20];
        struct Date date;
        char publisher[40];
        struct Book *next;
}book;

void getInput(struct Book *book);

void getInput(struct Book *book)
{
        printf("请输入书名:");
        scanf("%s",book->title );
        printf("请输入作者:");
        scanf("%s",book->author );
        printf("请输入价格:");
        scanf("%f",&book->price );
        printf("请输入日期:");
        printf("请输入出版社:");
        scanf("%s",book->publisher );
}

void addBook(struct Book **library);

void addBook(struct Book **library)
{
        struct Book *book,*temp;
        
        book = (struct Book *)malloc(sizeof(struct Book));
        if(book == NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        getInput(book);
        if(*library != NULL)
        {
                temp = *library;
                *library = book;
                book->next = temp;
        }
        else
        {
                *library = book;
                book->next = NULL;
        }
}
void printLibrary(struct Book *library)
{
        struct Book *book;
        int count = 1;
        
        book = library;
        while(book != NULL)
        {
                printf("Book%d:\n",count);
                printf("书名:%s\n",book->title);
                printf("作者:%s",book->author);
                printf("价格:%.2f",book->price);
                printf("日期:%d-%d-%d",book.date.year ,book.date.month ,book.date.day);
                printf("出版社:%s",book->publisher);
                book = book->next ;
                count++;
        }
}
void releaseLibrary(struct Book *library)
{
        while(library != NULL)
        {
                free(library);
                library = library->next ;
                
        }
}
int main(void)
{
        struct Book *library = NULL;
        int ch;
        
        while(1)
        {
                printf("请问是否要录入书籍信息(Y/N):");
                do
                {
                        ch = getchar();
                }while(ch != 'Y'&&ch != 'N');
                
                if(ch == 'Y')
                {
                        addBook(&library);
                }
                else
                {
                        break;
                }
        }
        
        printf("请问是否需要打印图书馆信息(Y/N):");
        do
        {
                ch = getchar();
        }while(ch != 'Y' && ch!= 'N');
        if(ch== 'Y')
        {
                printLibrary(library);
        }
        releaseLibrary(library);
        
        return 0;
}



报错显示date不是一个结构体或共用体

想问一下怎末改一下


这程序可以使用结构体数组来实现吗?

getInput()函数需要传入的是一个地址,book是结构体的变量名,不是一个地址呀,问什么不会出错,而加上&就会出错


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-8 16:51:15 | 显示全部楼层
没有看代码逻辑,就仅仅只是能够通过编译,没有警告
不知道运行怎么样
#include <stdio.h>
#include <stdlib.h>

struct Date {
    int year;
    int month;
    int day;
};

struct Book {
    char title[128];
    char author[40];
    float price[20];
    struct Date date;
    char publisher[40];
    struct Book *next;
} book;

void getInput(struct Book *book);

void getInput(struct Book *book) {
    printf("请输入书名:");
    scanf("%s", book->title);
    printf("请输入作者:");
    scanf("%s", book->author);
    printf("请输入价格:");
    //scanf("%f", &book->price);
    scanf("%f", book->price);
    printf("请输入日期:");
    printf("请输入出版社:");
    scanf("%s", book->publisher);
}

void addBook(struct Book **library);

void addBook(struct Book **library) {
    struct Book *book, *temp;

    book = (struct Book *)malloc(sizeof(struct Book));
    if(book == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }
    getInput(book);
    if(*library != NULL) {
        temp = *library;
        *library = book;
        book->next = temp;
    } else {
        *library = book;
        book->next = NULL;
    }
}
void printLibrary(struct Book *library) {
    struct Book *book;
    int count = 1;

    book = library;
    while(book != NULL) {
        printf("Book%d:\n", count);
        printf("书名:%s\n", book->title);
        printf("作者:%s", book->author);
        //printf("价格:%.2f", book->price);
        printf("价格:%.2f", book->price[0]);
        printf("价格:%p", book->price);
        //printf("日期:%d-%d-%d", book.date.year, book.date.month, book.date.day);
        printf("日期:%d-%d-%d", book->date.year, book->date.month, book->date.day);
        printf("出版社:%s", book->publisher);
        book = book->next;
        count++;
    }
}
void releaseLibrary(struct Book *library) {
    while(library != NULL) {
        free(library);
        library = library->next;
    }
}
int main(void) {
    struct Book *library = NULL;
    int ch;

    while(1) {
        printf("请问是否要录入书籍信息(Y/N):");
        do {
            ch = getchar();
        } while(ch != 'Y' && ch != 'N');

        if(ch == 'Y') {
            addBook(&library);
        } else {
            break;
        }
    }

    printf("请问是否需要打印图书馆信息(Y/N):");
    do {
        ch = getchar();
    } while(ch != 'Y' && ch != 'N');
    if(ch == 'Y') {
        printLibrary(library);
    }
    releaseLibrary(library);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 17:03:43 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

struct Date {
    int year;
    int month;
    int day;
};

struct Book {
    char title[128];
    char author[40];
    //float price[20];
    float price;
    struct Date date;
    char publisher[40];
    struct Book *next;
} book;

//void getInput(struct Book *book);

void getInput(struct Book *book) {
    printf("请输入书名:");
    scanf("%s", book->title);
    printf("请输入作者:");
    scanf("%s", book->author);
    printf("请输入价格:");
    //scanf("%f", &book->price);
    //scanf("%f", book->price);
    scanf("%f", &book->price);
    printf("请输入日期:");
    // 输入呢?
    scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);
    printf("请输入出版社:");
    scanf("%s", book->publisher);
}

//void addBook(struct Book **library);

void addBook(struct Book **library) {
    //struct Book *book, *temp;
    struct Book *book;

    //book = (struct Book *)malloc(sizeof(struct Book));
    book = malloc(sizeof(struct Book));
    if(book == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }
    getInput(book);
    /*
    if(*library != NULL) {
        temp = *library;
        *library = book;
        book->next = temp;
    } else {
        *library = book;
        book->next = NULL;
    }
    */
    book->next = *library;
    *library = book;
}

void printLibrary(struct Book *library) {
    struct Book *book;
    int count = 1;

    book = library;
    while(book != NULL) {
        printf("Book%d:\n", count);
        printf("书名:%s\n", book->title);
        printf("作者:%s", book->author);
        //printf("价格:%.2f", book->price);
        //printf("价格:%.2f", book->price[0]);
        printf("价格:%.2f", book->price);
        //printf("日期:%d-%d-%d", book.date.year, book.date.month, book.date.day);
        printf("日期:%d-%d-%d", book->date.year, book->date.month, book->date.day);
        printf("出版社:%s", book->publisher);
        book = book->next;
        count++;
    }
    printf("\n");
}

/*
void releaseLibrary(struct Book *library) {
    while(library != NULL) {
        free(library);
        library = library->next;
    }
}
*/

void releaseLibrary(struct Book *library) {
    if(!library) return;
    releaseLibrary(library->next);
    free(library);
}

int main(void) {
    struct Book *library = NULL;
    int ch;

    while(1) {
        printf("请问是否要录入书籍信息(Y/N):");
        do {
            ch = getchar();
        } while(ch != 'Y' && ch != 'N');

        if(ch == 'Y') {
            addBook(&library);
        } else {
            break;
        }
    }

    printf("请问是否需要打印图书馆信息(Y/N):");
    do {
        ch = getchar();
    } while(ch != 'Y' && ch != 'N');
    if(ch == 'Y') {
        printLibrary(library);
    }
    releaseLibrary(library);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 17:06:01 | 显示全部楼层
        第 73 行有错
                printf("日期:%d-%d-%d",book.date.year ,book.date.month ,book.date.day);
        这样修改
                printf("日期:%d-%d-%d",book -> date.year , book -> date.month , book -> date.day) ; // 【修改】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 19:19:41 | 显示全部楼层
jackz007 发表于 2021-11-8 17:06
第 73 行有错

        这样修改

为什莫不能用点号运算符呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 19:27:45 | 显示全部楼层
林江楠 发表于 2021-11-8 19:19
为什莫不能用点号运算符呢

因为 book 是一个指针,指向结构体的指针
指针用 箭头(->)
结构体用 点 (.)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 19:34:42 | 显示全部楼层
人造人 发表于 2021-11-8 19:27
因为 book 是一个指针,指向结构体的指针
指针用 箭头(->)
结构体用 点 (.)

记错了,我还以为指针直接可以用点号运算符,看了一眼笔记要加*进行解引用才可以,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 19:53:55 | 显示全部楼层
知道了,book在函数中是一个结构体指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 19:59:32 | 显示全部楼层
林江楠 发表于 2021-11-8 19:34
记错了,我还以为指针直接可以用点号运算符,看了一眼笔记要加*进行解引用才可以,谢谢了

你的代码还有其他问题,具体看 3 楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 21:11:00 | 显示全部楼层
指针和结构体用的符号不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表