为什么fgets()在缓冲区中的最后一个字符后存储\ 0?

时间:2015-12-23 10:46:52

标签: c

我一直在阅读Linux程序员手册阅读各种功能,并试图更深入地了解它们是什么/它们如何工作。

查看fgets()我读到“A”\ 0'存储在缓冲区中的最后一个字符之后。

我已阅读What does \0 stand for?并对\0符号化(空字符对吗?)有充分的了解。但我正在努力掌握的是它与fgets()的相关性,我真的不明白为什么它“需要”以空字符结束。

4 个答案:

答案 0 :(得分:4)

正如您已经说过的,您可能知道\0构成C中所有字符串的结尾。根据C标准,字符串的所有内容都需要\0终止。

由于fgets()生成一个字符串,当然该字符串将被正确地终止。

请注意,对于C中的所有字符串函数,您使用或生成的任何字符串都必须以\0字符终止。

答案 1 :(得分:3)

因为否则你不知道结果字符串有多长。

fgets的一个参数是要读取的最大字符数,但它只是:最大值。如果要求512个字符,但缓冲区中只有8个字符,则只能获得8个字符...并且在第9个插槽中为NULL以标记C字符串的逻辑结尾。

可以说,fgets可以设计为返回读取的字符数,但是在大多数情况下,您只需要手动添加NULL字节,并且该函数必须找到一种方法表示除了返回空指针之外的错误。

答案 2 :(得分:0)

来自C standards

  

fgets函数 最多读取的数量少于1   由流指向的流中的n指定的字符   s指向的数组。 a后没有读取其他字符   换行符(保留)或文件结束后。 空   在读入最后一个字符后立即写入字符   数组

这是为了确保创建的字符串中没有缓冲区溢出(字符/内容不超出提供的存储空间)。

答案 3 :(得分:0)

正如我前面的所有人所说,fgets从文件中读取字节并将它们转换为标准的C字符串,该字符串以空值终止。 \0字节的终止反映了这个函数是面向文本的事实。

如果您不想对从文件读取的数据使用空终止,则它不是字符串(不是文本),并且行尾字节\n也没有意义。在这种情况下,您可以使用fread

所以C有两个函数可以从文件中读取:fgets用于文本,fread用于非文本(二进制数据)。

顺便说一句,如果输入文件有一个真正的零值字节,fgets会做一件令人不舒服的事情:它将继续读取,直到它读取行尾字节\n和输出“string”将具有两个(或更多)空终止。这对文本没有任何意义,因此它是fgets面向文本且不适合任意数据的另一个例子。