帮我看看哪儿里错了,关于结构体的?
为什么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;
} 问题出在第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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2023-12-25 22:21
问题出在第18行,你需要给字符数组分配足够的空间来存储输入的字符串。当前的定义是`char title`,这只能存 ...
你的回答虽然不对,但提醒了我,谢谢。 hanghanga 发表于 2023-12-25 22:25
你爹回答虽然不对,但提醒了我,谢谢。
非常抱歉,如果我的回答有任何错误。如果你有其他问题或需要进一步的帮助,请随时告诉我。我会尽力提供正确的解答。祝你编程愉快!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 struct Book *getInput(struct Book *book)
{
printf("请输入书名:");
scanf("%s", &book->title);
printf("请输入作者:");
scanf("%s", &book->author);
printf("请输入售价:");
scanf("%f", &book->price);
没取地址,直接用了野变量(本人不是很擅长c/c++, 有错请指正) 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]