hanghanga 发表于 2023-12-25 22:21:21

帮我看看哪儿里错了,关于结构体的?

为什么main函数里,用注释的写法就可以正常运行,用现在的写法,输入的时候,第25行会报错:Segmentation fault
#include <stdio.h>

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

struct Book
{
    char title;
    char author;
    float price;
    struct Date date;
    char publisher;
};

struct Book *getInput(struct Book *book);
void printBook(struct Book *book);

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

    return book;
}

void printBook(struct Book *book)
{
    printf("\n\n======开始打印书籍信息======\n\n");
    printf("书名:%s\n", book->title);
    printf("作者:%s\n", book->author);
    printf("售价:%.2f\n", book->price);
    printf("日期:%4d-%2d-%0.2d\n", book->date.year, book->date.month, book->date.day);
    printf("出版社:%s\n", book->publisher);
}

int main(void)
{
    struct Book *book = NULL;
    // struct Book book;
    // struct Book *my_book = getInput(&book);
    struct Book *my_book = getInput(book);
    printBook(my_book);

    return 0;
}

FishC 发表于 2023-12-25 22:21:36

问题出在第18行,你需要给字符数组分配足够的空间来存储输入的字符串。当前的定义是`char title`,这只能存储一个字符,应该修改为`char title`,这样就可以存储最多50个字符的字符串了。同样,也需要修改`char author`和`char publisher`的定义。

另外,第25行的错误是因为传递给`getInput`函数的参数`book`为空指针。你可以通过将`struct Book book;`改为`struct Book *book = malloc(sizeof(struct Book));`来动态分配内存,并确保在使用完之后使用`free(book);`来释放内存。

修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>

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

struct Book
{
    char title;
    char author;
    float price;
    struct Date date;
    char publisher;
};

struct Book *getInput(struct Book *book);
void printBook(struct Book *book);

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

    return book;
}

void printBook(struct Book *book)
{
    printf("\n\n======开始打印书籍信息======\n\n");
    printf("书名:%s\n", book->title);
    printf("作者:%s\n", book->author);
    printf("售价:%.2f\n", book->price);
    printf("日期:%4d-%2d-%0.2d\n", book->date.year, book->date.month, book->date.day);
    printf("出版社:%s\n", book->publisher);
}

int main(void)
{
    struct Book *book = malloc(sizeof(struct Book));
    struct Book *my_book = getInput(book);
    printBook(my_book);
    free(book);

    return 0;
}

这样修改后,你应该可以正常运行程序并且不会报错了。记得在使用完动态分配的内存后,要及时使用`free`函数释放内存。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

hanghanga 发表于 2023-12-25 22:25:53

FishC 发表于 2023-12-25 22:21
问题出在第18行,你需要给字符数组分配足够的空间来存储输入的字符串。当前的定义是`char title`,这只能存 ...

你的回答虽然不对,但提醒了我,谢谢。

FishC 发表于 2023-12-25 22:26:01

hanghanga 发表于 2023-12-25 22:25
你爹回答虽然不对,但提醒了我,谢谢。

非常抱歉,如果我的回答有任何错误。如果你有其他问题或需要进一步的帮助,请随时告诉我。我会尽力提供正确的解答。祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

歌者文明清理员 发表于 2023-12-25 22:58:19

struct Book *getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s", &book->title);
    printf("请输入作者:");
    scanf("%s", &book->author);
    printf("请输入售价:");
    scanf("%f", &book->price);

没取地址,直接用了野变量(本人不是很擅长c/c++, 有错请指正)

jackz007 发表于 2023-12-25 23:04:10

int main(void)
{
    struct Book * book = NULL            ; // 【错误】:这样定义的 book 只是一个指针,而指针是不能储存结构体数据的,你需要定义的是一个结构体
    struct Book * my_book = getInput(book) ; // 【错误】:book 被初始化为 NULL 也就是 0 值,是一个无法访问的内存地址,所以,就出错了。
    printBook(my_book);

    return 0;
}
      这样写才对
int main(void)
{
    struct Book book;
    getInput(& book);
    printBook(& book) ;
    return 0;
}
页: [1]
查看完整版本: 帮我看看哪儿里错了,关于结构体的?