鱼C论坛

 找回密码
 立即注册
查看: 1639|回复: 5

[已解决]帮我看看哪儿里错了,关于结构体的?

[复制链接]
发表于 2023-12-25 22:21:21 | 显示全部楼层 |阅读模式

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

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

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

  2. struct Date
  3. {
  4.     int year;
  5.     int month;
  6.     int day;
  7. };

  8. struct Book
  9. {
  10.     char title[128];
  11.     char author[40];
  12.     float price;
  13.     struct Date date;
  14.     char publisher[40];
  15. };

  16. struct Book *getInput(struct Book *book);
  17. void printBook(struct Book *book);

  18. struct Book *getInput(struct Book *book)
  19. {
  20.     printf("请输入书名:");
  21.     scanf("%s", book->title);
  22.     printf("请输入作者:");
  23.     scanf("%s", book->author);
  24.     printf("请输入售价:");
  25.     scanf("%f", &book->price);
  26.     printf("请输入出版日期:");
  27.     scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);
  28.     printf("请输入出版商:");
  29.     scanf("%s", book->publisher);

  30.     return book;
  31. }

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

  41. int main(void)
  42. {
  43.     struct Book *book = NULL;
  44.     // struct Book book;
  45.     // struct Book *my_book = getInput(&book);
  46.     struct Book *my_book = getInput(book);
  47.     printBook(my_book);

  48.     return 0;
  49. }
复制代码
最佳答案
2023-12-25 23:04:10
  1. int main(void)
  2. {
  3.     struct Book * book = NULL              ; // 【错误】:这样定义的 book 只是一个指针,而指针是不能储存结构体数据的,你需要定义的是一个结构体
  4.     struct Book * my_book = getInput(book) ; // 【错误】:book 被初始化为 NULL 也就是 0 值,是一个无法访问的内存地址,所以,就出错了。
  5.     printBook(my_book);

  6.     return 0;
  7. }
复制代码

        这样写才对
  1. int main(void)
  2. {
  3.     struct Book book  ;
  4.     getInput(& book)  ;
  5.     printBook(& book) ;
  6.     return 0;
  7. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-12-25 22:21:36 | 显示全部楼层
问题出在第18行,你需要给字符数组分配足够的空间来存储输入的字符串。当前的定义是`char title`,这只能存储一个字符,应该修改为`char title[50]`,这样就可以存储最多50个字符的字符串了。同样,也需要修改`char author`和`char publisher`的定义。

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

修改后的代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Date
  4. {
  5.     int year;
  6.     int month;
  7.     int day;
  8. };
  9. struct Book
  10. {
  11.     char title[50];
  12.     char author[50];
  13.     float price;
  14.     struct Date date;
  15.     char publisher[50];
  16. };
  17. struct Book *getInput(struct Book *book);
  18. void printBook(struct Book *book);
  19. struct Book *getInput(struct Book *book)
  20. {
  21.     printf("请输入书名:");
  22.     scanf("%s", book->title);
  23.     printf("请输入作者:");
  24.     scanf("%s", book->author);
  25.     printf("请输入售价:");
  26.     scanf("%f", &book->price);
  27.     printf("请输入出版日期:");
  28.     scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);
  29.     printf("请输入出版商:");
  30.     scanf("%s", book->publisher);
  31.     return book;
  32. }
  33. void printBook(struct Book *book)
  34. {
  35.     printf("\n\n======开始打印书籍信息======\n\n");
  36.     printf("书名:%s\n", book->title);
  37.     printf("作者:%s\n", book->author);
  38.     printf("售价:%.2f\n", book->price);
  39.     printf("日期:%4d-%2d-%0.2d\n", book->date.year, book->date.month, book->date.day);
  40.     printf("出版社:%s\n", book->publisher);
  41. }
  42. int main(void)
  43. {
  44.     struct Book *book = malloc(sizeof(struct Book));
  45.     struct Book *my_book = getInput(book);
  46.     printBook(my_book);
  47.     free(book);
  48.     return 0;
  49. }
复制代码

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


你的回答虽然不对,但提醒了我,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-25 22:26:01 | 显示全部楼层
hanghanga 发表于 2023-12-25 22:25
你爹回答虽然不对,但提醒了我,谢谢。

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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++, 有错请指正)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-25 23:04:10 | 显示全部楼层    本楼为最佳答案   
  1. int main(void)
  2. {
  3.     struct Book * book = NULL              ; // 【错误】:这样定义的 book 只是一个指针,而指针是不能储存结构体数据的,你需要定义的是一个结构体
  4.     struct Book * my_book = getInput(book) ; // 【错误】:book 被初始化为 NULL 也就是 0 值,是一个无法访问的内存地址,所以,就出错了。
  5.     printBook(my_book);

  6.     return 0;
  7. }
复制代码

        这样写才对
  1. int main(void)
  2. {
  3.     struct Book book  ;
  4.     getInput(& book)  ;
  5.     printBook(& book) ;
  6.     return 0;
  7. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 11:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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