我试图运行此代码,但它无法正常工作。任何人都可以告诉我这段代码有什么问题 收到第一个输入后,程序正在终止。
int main()
{
char name[100],college_name[100],address[100];
printf("Enter your name :");
scanf("%[^\n]s",name);
printf("Enter college name :");
scanf("%[^\n]s",college_name);
printf("Enter address :");
scanf("%[^\n]s",address);
}
答案 0 :(得分:2)
您的scanf
来电正确读取所有内容 - 但不包括 - \n
。
问题是\n
仍然在输入流上。因此,当第二个和第三个scanf
调用运行时,它们什么都没找到。 (他们读取零个字符,但不包括下一个\n
。)
最简单的解决方法是致电getchar()
阅读并弃掉\n
个字符:
#include <stdio.h>
int main()
{
char name[100],college_name[100],address[100];
printf("Enter your name :");
scanf("%[^\n]",name);
getchar(); /* discard \n */
printf("Enter college name :");
scanf("%[^\n]",college_name);
getchar(); /* discard \n */
printf("Enter address :");
scanf("%[^\n]",address);
getchar(); /* discard \n */
}
(我还删除了s
来电中无关的scanf
个字符。它是%[]
,而不是%[]s
。)
现在,在一个层面上,这是一个糟糕的解决方案。从理论上讲,我们应该检查getchar()
读取的字符实际上是\n
。但是(a)在这种情况下它几乎必须是,并且(b)任何使用scanf
读取用户输入的程序已经是kludgey且不可靠,因此添加一些kludgey并且可能不可靠(但很简单){{ 1}}通话不会让它变得更糟。
(有人会建议 - 一条评论甚至建议 - 调用getchar
来摆脱无关的新行。这可能适用于某些平台,但它不能保证并且它赢了# 39;无处不在,所以这是一个更糟糕的解决办法。)
这里的真正教训是,不要像这样使用fflush(stdin)
进行用户输入。不幸的是,在这样的开始程序中,用户输入显然是首选,因为它似乎如此简单方便。但事实证明(当你尝试制作实际有效的程序时)scanf
实际上只是 方便,所以一旦你学到更多关于C的知识,您将完全放弃scanf
,并使用更强大,更可靠的技术完成所有输入。 (您的下一个问题可能是,更可靠的技术是什么?一种是使用scanf
读取用户输入行,然后根据需要操纵这些行。另请参阅http://c-faq.com/stdio/scanfprobs.html,https://www.eskimo.com/~scs/cclass/notes/sx10h.html ,和https://www.eskimo.com/~scs/cclass/notes/sx12e.html。)