我一直在阅读Linux程序员手册阅读各种功能,并试图更深入地了解它们是什么/它们如何工作。
查看fgets()
我读到“A”\ 0'存储在缓冲区中的最后一个字符之后。
我已阅读What does \0 stand for?并对\0
符号化(空字符对吗?)有充分的了解。但我正在努力掌握的是它与fgets()
的相关性,我真的不明白为什么它“需要”以空字符结束。
答案 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
面向文本且不适合任意数据的另一个例子。