我正在编写代码,它调用了两个不同的函数,我们使用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个字符加上