while循环在第二次迭代时跳过第一个`fgets()`

时间:2018-01-17 22:33:08

标签: c while-loop fgets input-buffer

我知道这样的问题一直都会被问到,而且我已经阅读了几个,但是,我从来没有在我的代码中使用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: %s\n", word);
        printf("Would you like to go again?");
        fgets(answer, sizeof(answer), stdin);
        printf("%d\n", 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更容易大声笑)

1 个答案:

答案 0 :(得分:3)

当您输入webfarm_redis时,输入缓冲区中有2个字符:Y<ENTER>Y。由于\nanswerchar[2]始终写入C字符串,因此fgets中保存的字符串将为answer

换行符保留在输入缓冲区中,因此下一个"Y"读取输入缓冲区的剩余部分。由于其换行符fgets只读取换行符,因此fgets将包含字符串word

您可以使用更大的维度(至少为3)声明数组"\n"或使用answer代替。如果你选择前者,那么你应该做

word

修改

我想在char answer[10]; ... if (strcmp(answer, "F\n") == 0) ... 手册页中添加引用,这总结了fgets的方式 工作

  

man fgets

fgets
     

<强>描述

     

#include <stdio.h> char *fgets(char *s, int size, FILE *stream); fgets()读取最多一个size个字符,并将它们存储到stream指向的缓冲区中。   s或换行符后停止阅读。如果读取换行符,则将其存储到缓冲区。终止空字节(EOF)   存储在缓冲区中的最后一个字符之后。