我已经将此代码作为一个更大程序的一部分编写:
main()
{ int num;
char word[50];
list_head=NULL;
while(1)
{
puts("Give number : ");
scanf("%d",num);
if (num==0) break;
printf("Give name : ");
gets(word);
if (strcmp(word,"")==0) break;
add_node_to_list(num,word);
}
当我运行程序时,屏幕上会出现消息"Give number:",当我给出一个数字时,会出现一条消息("程序没有响应,将关闭"),就像无限循环的情况一样。我通过调试推断出问题是scanf,但我不确定。
两件事。
-
scanf()
中的&
和其他提到的一样:scanf("%d",&num);
-
取整数后,输入中有一个剩余的
n
缓冲器因此gets()
将输入""
。因此,在
scanf()
之后执行getchar()
。这会带走来自输入缓冲器的CCD_ 8和CCD_。
此外,最好不要将get用于字符串输入。
scanf(3)
需要变量的地址才能正常工作。
更改
scanf("%d",num);
至
scanf("%d", &num);
您应该提供num的地址,而不是num本身。现在,应用程序正试图在第一次运行时写入地址0。
正确的方法是
scanf("%d",&num);
顺便说一句,如果你已经阅读了编译器的警告,你就会知道了。
其他人说了什么-;在CCD_ 11中是重要的。此外,您的scanf将读取数字,但不会读取后面的换行符,因此gets()
读取该换行符并生成一个空字符串。在%d
后面加一个空白可以修复scanf("%d ", &num)
。
通常,您根本不应该使用gets()
,因为它不会检查缓冲区溢出(如果您输入的字符超过50个,就会发生有趣的事情),但现在还可以,因为您还在学习中。