0

我希望知道 fgets() 被强制执行后 buf 的左侧部分会是什么。例如: 如果一行只有 10 个字符 + '\n',那么 buf 的左边部分(从 but[12] 到 buf[99])会是什么? 如果执行 fgets() 两次,第二个输入会覆盖 buf 的第一个输入吗?
char buf[100];
fgets(buf, sizeof(buf), fp);


4

2 回答 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 回答