fgets() 不会连续第二次要求输入

fgets() doesn't ask for input the second time in a row

我正在编写调用 2 个使用 fgets() 的不同函数的代码,但我注意到第二个 fgets() 被跳过了。我试着制作一个测试文件来解决这个问题,但我注意到即使在编写非常简单的代码时它仍然不会等待我第二次输入。编辑:将 [3] 更改为 [4],但仍然无效。

#include <stdio.h>

main()
{
    char I[4];
    
    fgets(I,3,stdin);
    
    printf("%s",I);
    
    fgets(I,3,stdin);
    
    printf("%s",I);
}

fgets() 的原型将其定义为,char *fgets(char *str, int n, FILE *stream),其中 n - 1 是要读取的最大字符数,对于这样的输入:

A1\n,你有三个字符和 NULL 字节,所以 A1\n[=14=].

通过将 n 设置为 3,您告诉 fgets() 它最多读取 2 个字符加上 [=17=] 终止字符串。因此,换行符 (\n) 留在缓冲区中,稍后被下一个 fgets() 调用使用。

所以将 fgets(I, 3, stdin) 更改为 fgets(I, 4, stdin) 应该可以解决您的问题。您可能还想考虑检查 fgets() 的 return 值,以防它 return 是 NULL 指针。

出现这个问题是因为键盘缓冲区没有被清除。基本上在第一个fgets如果键盘输入达到了输入缓冲区大小的限制,剩下的会被下一个fgets读取。

此示例根据您遇到的问题运行:

#include <stdio.h>
#include <string.h>

void flushBuffer() {
    int ch;
    while (((ch = getchar()) != EOF) && (ch != '\n'));
}

int main()
{
    char I[3];

    fgets(I, sizeof(I), stdin);
    printf("\n%s",I);

    if ( strchr( I, '\n' ) == NULL )
    {
        flushBuffer();
    }

    fgets(I, sizeof(I), stdin);
    printf("\n%s",I);

    return 0;
}

还有一点就是用sizeof运算符来表示向量的大小。 至于vector的大小,确实很小,可以的话根据自己的需要取大一点。

I thought that it would need

要完全阅读 "A1\n"fgets() 至少需要 4. 3 1 read 和 1 用于附加的 null character 以形成 string.

The fgets function reads at most one less than the number of characters specified by n from the stream pointed to by stream into the array pointed to by s. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array. C2x dr § 7.21.7.2 2

输入 "A1\n"fgets(I,3,stdin);fgets() 读取 "A1",将 '"\n" 留给下一个 fgets()。第二个 fgets() return 立即读取 '\n'.


相反

  • 使用大量缓冲区。无论您认为最大的正常输入是什么,我都推荐 2 倍。

  • 传入fgets()缓冲区的大小。

  • 勾选return

  • 为清楚起见,用标记打印

.

// char I[4];
// fgets(I,3,stdin);
// printf("%s",I);

char I[100];
if (fgets(I, sizeof I, stdin)) {
  printf("<%s>\n", I);
}

1 在 C 中,“每行由零个或多个字符加上一个终止换行符组成。”