C语言 while 循环在第二次迭代时跳过第一个 'fgets()'



我知道这样的问题总是被问到,而且我已经读过几个,但是,我从来没有像所有其他代码那样在我的代码中使用scanf(),所以我找不到类似的问题。 我不知道为什么在第二次、第三次、第四次等迭代中,while 循环会跳过我的第一个fgets()

法典:

int main()
{
char word[40];
char answer[2];
while(true) {
printf("Please enter word: ");
fgets(word, sizeof(word), stdin);
printf("Your word is: %sn", word);
printf("Would you like to go again?");
fgets(answer, sizeof(answer), stdin);
printf("%dn", strcmp(answer, "F"));
if (strcmp(answer, "F") == 0) {
printf("breaking");
break;
} else {
printf("continuing");
continue;
}
}
}

输出:

Please enter word: Hey
Your word is: Hey
Would you like to go again?Y
Please enter word: Your word is: 
Would you like to go again?Y
Please enter word: Your word is: 
Would you like to go again?Y

。等。

我认为这与清除输入缓冲区有关,我已经尝试了几件事,但没有任何效果。 第二天弄乱了C,所以我不太明白。(Python更容易,哈哈)

当您输入Y<ENTER>时,输入缓冲区中有 2 个字符:Yn。由于answerchar[2]并且fgets总是写入 C 字符串,因此保存在answer中的字符串将被"Y"

换行符保留在输入缓冲区中,因此下一个fgets将读取输入缓冲区的其余部分。因为它是换行符,所以fgets只读取换行符,因此word将字符串"n"

可以使用较大的维度(至少 3)声明数组answer,也可以改用word。如果你选择前者,那么你应该做

char answer[10];
...
if (strcmp(answer, "Fn") == 0)
...

编辑

我想从fgets手册页中添加一个引用,这总结了如何fgets工作。

男人的飞人

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);

描述

fgets()stream中最多读入一个少于size个字符,并将它们存储到s指向的缓冲区中。读取在EOF或换行符后停止。 如果读取换行符,则会将其存储到缓冲区中。 终止空字节 ('') 存储在缓冲区中最后一个字符之后。

最新更新