我希望知道在fgets()被执行后buf的左边部分会是什么。例如:
char buf[100];
fgets(buf, sizeof(buf), fp);
如果一行只有10个字符+'\ n',那么buf的左边部分是什么(从[12]到buf [99])?
如果执行fgets()两次,第二个输入是否会覆盖buf的第一个输入?
答案 0 :(得分:1)
当fgets
读取数据时,它一次更改缓冲区的一个元素(简化假设),直到达到限制或在输入中找到终结符。缓冲区中的所有其他元素与调用fgets
之前保持相同(因此,它们可能具有随机数据,或者它们可能泄漏先前读取的信息)。
答案 1 :(得分: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函数最多读取的数量少于1 由流指向的流中的n指定的字符 s 指向的数组。之后不会读取其他字符 换行符(保留)或文件结束后。空 在读入最后一个字符后立即写入字符 数组。
<强>返回强>
如果成功,fgets函数返回s。 如果文件结尾是 遇到并且没有字符被读入数组, 数组的内容保持不变,空指针是 回。 如果在操作期间发生读取错误,则为阵列 内容是不确定的,并返回空指针。
强调我的:)
现在第二个问题: -
If execute fgets() twice, will the second input cover the first input to buf?
如果通过覆盖第二个输入意味着覆盖然后是,显然它将覆盖第一个输入,你可以自己执行并查看。