我有以下代码:
int i = 0;
char ar[500];
while(i < 20)
{
printf("Type a line: ");
fgets(ar, 500, stdin);
fprintf(fp,"%s", ar);
i++;
}
基本上,我试图打开一个文件,然后从用户那里获取20行输入并将其存储在数组中,然后将其打印到文件中。它工作正常,但我不明白fgets在while循环中如何工作。据我了解,当i = 0时,fgets将第一行存储到ar [500]中,而fprintf将其输出到文件中,当i = 1时,fgets将第二行存储到ar [500]中,但是现在ar [500]有2行,但是为什么当我增加1时,fprintf只将第二行打印到文件,而不是全部2行,依此类推。
答案 0 :(得分:4)
fgets总是开始在arr [0]处填充数组。在每次迭代时,前一行将被覆盖。 fgets将在arr中为您添加空终止符,因此仅当前读取的行将输出到fp所指向的FILE。
答案 1 :(得分:4)
char *fgets(char * restrict s, int n, FILE * restrict stream);
的描述为(C11 7.21.7p2):
2
fgets
函数从stream指向的流到n
指向的数组中读取的字符数最多少于s
指定的字符数。在换行符(保留)或文件结束之后,不会读取其他字符。在将最后一个字符读入数组后,立即写入空字符。
fgets
读取的第一个字符将始终存储在s[0]
中,依此类推,直到最多s[n - 1]
或遇到的第一个换行符(它是最后存储的字符)。读取的最后一个字符之后的元素将设置为'\0'
,从而终止该字符串。
即实际上,fgets
调用将覆盖数组中的k + 1
个第一个元素,其中k
是行的长度或n
(以较小者为准),而1
表示空终止。
要存储20行,您需要一个数组数组:
char ar[20][500];
然后读入ar[i]
。
答案 2 :(得分:3)
缓冲区ar
每次都会被覆盖。
fgets
具有原型char *fgets(char *str, int n, FILE *stream)
。它将从n-1
中读取最多stream
个字符并将它们写入str
,然后添加'\0'
字符。
答案 3 :(得分:0)
关于:“但是ar [500]现在有2行,”
否,函数fgets()
不附加。
相反,它会覆盖。
在发布的代码中,始终从ar[0]
开始