在fgets()之后buf的左边部分是什么?

时间:2013-09-08 00:26:59

标签: c input buffer fgets

我希望知道在fgets()被执行后buf的左边部分会是什么。例如:
char buf[100];
fgets(buf, sizeof(buf), fp);

如果一行只有10个字符+'\ n',那么buf的左边部分是什么(从[12]到buf [99])? 如果执行fgets()两次,第二个输入是否会覆盖buf的第一个输入?

2 个答案:

答案 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?

如果通过覆盖第二个输入意味着覆盖然后是,显然它将覆盖第一个输入,你可以自己执行并查看。