1

我知道这样的问题一直被问到,而且我已经阅读了几个,但是,我从来没有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

...ETC。

我认为这与清除输入缓冲区有关,我尝试了几件事,但没有任何效果。第二天乱搞C,所以我不太了解。(Python 更简单,哈哈)

4

1 回答 1

4

当您输入 时Y<ENTER>,输入缓冲区中有 2 个字符:Y\n. 因为answer是 achar[2]并且fgets总是写一个 C 字符串,所以保存在其中的字符串answer将是"Y".

换行符保留在输入缓冲区中,因此 nextfgets读取输入缓冲区的剩余部分。因为它是换行符,fgets只读取换行符,因此word会有字符串"\n"

您可以声明answer具有更大维度(至少 3)的数组或使用word。如果您选择前者,那么您应该这样做

char answer[10];
...
if (strcmp(answer, "F\n") == 0)
   ...

编辑

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

人 fgets

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

描述

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

于 2018-01-17T22:44:26.797 回答