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

  • 本文关键字:第二次 连续 fgets c fgets
  • 更新时间 :
  • 英文 :


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

#include <stdio.h>
main()
{
char I[4];

fgets(I,3,stdin);

printf("%s",I);

fgets(I,3,stdin);

printf("%s",I);
}

我以为它只需要3个

要在"A1n"中完全读取,fgets()至少需要4。3用于1读取,1用于附加的空字符以形成字符串

fgets函数从流指向的流中最多读取一个小于n指定的字符数的字符到s指向的数组中。在换行符(保留(或文件结束后不会读取其他字符。在读取到数组中的最后一个字符之后立即写入一个空字符。C2x dr§7.21.7.2 2

对于输入"A1n"fgets(I,3,stdin);fgets()读取"A1",将'"n"留给下一个fgets()。第二个CCD_ 9在读取CCD_。


替代

  • 使用充足的缓冲区。我推荐2倍,无论你认为最大正常输入是多少。

  • 将缓冲区的大小传递给fgets()

  • 检查返回

  • 使用哨兵打印以提高的清晰度

// 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中;每一行由零个或多个字符加上一个终止的新行字符组成">

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

A1n,您有三个字符和NULL字节,所以A1n

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

因此,将fgets(I, 3, stdin)更改为fgets(I, 4, stdin)应该可以解决您的问题。您可能还需要考虑检查fgets()的返回值,以防它返回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运算符来指示向量的大小。至于向量的大小,它确实很小,如果可能的话,可以根据你的需要放一个更大的值。

最新更新