如何在c中制作堆栈,程序不会仅输出所有输入的字符串 发生了什么?不知道该写什么,但网站要求写一些东西,认为没有任何解释。当我想借助下一本书的链接打印所有书籍时,它只输出最后输入的东西。是覆盖吗?
#include <stdio.h>
#include <string.h>
typedef struct book book;
struct book{
book *next;
char name[100];
int year;
char author[100];
};
void setter(book *aza, int number){
char name[100];
int year;
char author[100];
scanf("%s", name);
scanf(" %d", &year);
scanf("%s", author);
strcpy( aza->name , name );
aza->year = year;
strcpy( aza->author, author );
number--;
if(number==0){
return;
}else{
setter(&aza->next, number);
}
}
printBooks(book *aza){
if(aza){
printf("%s\n", &aza->name);
printBooks(&aza->next);
}
}
int main()
{
book kitap;
int number;
scanf("%d", &number);
setter(&kitap, number);
printBooks(&kitap);
return 0;
}
答案 0 :(得分:1)
setter(&aza->next, number);
这是问题的根源 - next
指向哪里?它包含一些无处可寻的垃圾值。尝试访问它是未定义的行为。这就是你所做的。
分配内存并将其传递给setter - 另一方面,它试图访问一些随机内存并尝试在其中设置值。您可以使用malloc
分配内存并使此结构实例的next
指向它。
为了帮助你改变一下: -
aza->next = malloc(sizeof *(aza->next));
setter(aza->next, number);
同样位于printBooks
因为scanf
期望char*
不是char (*)[]
,而且printBooks
函数应该采用book*
。
printf("%s\n", aza->name);
printBooks(aza->next);
使用一些代码的插图 - here。此外,您还需要编写函数来释放除第一个结构实例之外的所有这些内存。