我希望知道 fgets() 被强制执行后 buf 的左侧部分会是什么。例如:
如果一行只有 10 个字符 + '\n',那么 buf 的左边部分(从 but[12] 到 buf[99])会是什么?
如果执行 fgets() 两次,第二个输入会覆盖 buf 的第一个输入吗?
char buf[100];
fgets(buf, sizeof(buf), fp);
问问题
389 次
2 回答
1
#define SIZE 100
...
char buf[SIZE];
fgets
从给定的文件流中读取最多 SIZE - 1
字符并将它们存储在buf
. 生成的字符串始终以 NULL 结尾。如果出现文件结尾或找到换行符,解析将停止,在这种情况下buf
将包含该换行符。数据的左侧保持不变,它将包含之前保存的任何内容,可能是随机数据或内存中剩余的任何内容。这已通过以下 C 标准验证:
从 C11 标准:-
7.21.7.2 fgets 函数
概要
#include <stdio.h> char *fgets(char * restrict s, int n, FILE * restrict stream);
描述
fgets 函数最多从 stream 指向的流中读取比 n 指定的字符数少 1 的字符到s指向的数组中。在换行符(保留)之后或文件结尾之后不会读取其他字符。在读入数组的最后一个字符之后立即写入一个空字符。
退货
如果成功, fgets 函数将返回 s。如果遇到文件结尾并且没有字符被读入数组,则数组的内容保持不变并返回一个空指针。如果在操作过程中发生读取错误,则数组内容是不确定的,并返回一个空指针。
强调我的:)
现在是第二个问题:-
If execute fgets() twice, will the second input cover the first input to buf?
如果通过覆盖第二个输入你的意思是覆盖然后是的,显然它会覆盖第一个输入,你可以自己执行并查看。
于 2013-09-08T05:03:14.373 回答
1
读取数据时fgets
,它一次更改缓冲区的一个元素(简化假设),直到达到限制或在输入中找到终止符。缓冲区中的所有其他元素与调用之前保持相同fgets
(因此,它们可能具有随机数据,或者可能泄漏先前读取的信息)。
于 2013-09-08T01:23:57.207 回答