我已经尝试过寻找错误所在,但似乎找不到。我知道这一定与我使用fgets的方式有关,但我无法想象出是什么原因。我读到了混用fgets和scanf可能会产生错误,所以我甚至将第二个scanf更改为fgets,但它仍然跳过了我的其余输入,只打印了第一个。
int addstudents = 1;
char name[20];
char morestudents[4];
for (students = 0; students<addstudents; students++)
{
printf("Please input student name\n");
fgets(name, 20, stdin);
printf("%s\n", name);
printf("Do you have more students to input?\n");
scanf("%s", morestudents);
if (strcmp(morestudents, "yes")==0)
{
addstudents++;
}
}
我的输入是Joe、yes、Bill、yes、John、no。如果我使用scanf代替第一个fgets,一切都按计划进行,但我想要能够使用包含空格的全名。我错在哪里了?
int c; while ((c = getchar()) != EOF && c != '\n') ;
,其中循环体的分号将位于自己的一行上。这可以保护您免受用户输入yes please
或仅在输入末尾放置空格的影响。在这种情况下,使用int c
而不是char c
是至关重要的。在原始代码中,您不使用c
(因此我的默认编译器选项会抱怨设置但未使用的变量;如果我在此处使用代码,我将得到(void)getchar();
),因此无法可靠地区分EOF
和有效字符并不重要。 - Jonathan Leffler