c语言 - "fgets will not stop if it encounters a NUL"是什么意思



所以,我在StackOverflow上找到了下面的答案

fgets在C99或当前的标准C11中实际上并没有被弃用。但该教程的作者是对的,fgets在遇到NUL时不会停止,也没有报告读取此类字符的机制。

fgets函数从流指向的流中最多读取一个小于n指定的字符数的字符到s指向的数组中。在换行符(保留(或文件结束后不会读取其他字符。

如果遇到NUL,fgets不会停止是什么意思?请用一个简单的代码片段来解释。

链接:为什么不赞成使用fgets函数?

按照惯例,C中的字符串是"NUL终止的"。这意味着字符串的末尾由"NUL"字符的存在来决定。NUL字符是字符'',或者更具体地说是具有值0的char。所有的C字符串文字都以NUL结尾,而大多数接受字符串的C API(在标准库和大多数其他用C编写的库中(都希望这些字符串以NUL结束。

这也意味着NUL字符不能在期望NUL终止的API中用作正常数据值。这些API将NUL字符视为字符串数据中有意义的部分,而不是字符串的末尾。例如,strlen("foobar")是3,而不是7。

CCD_ 6从文件流中读取字符数据。但该文件可以包含NUL字符。该帖子所说的是,fgets将像对待任何其他字符一样对待文件中的NUL字符。fgets会以NUL终止给定的字符串,但如果文件包含NUL字符,fgets会尽职尽责地读取它们。

这就是帖子所警告的:fgets不会将NUL字符与任何其他字符区别对待,而大多数其他C API函数都会这样做。因此,如果您将fgets生成的字符串传递给某个要求NUL终止的API,则如果该文件包含NUL字符,则可能会出现问题。

Fgets仅用于文本文件。为什么文本文件中会有null?因此,对于大多数用途来说,它都非常好。最坏的情况是,您无法看到null字符之后的内容,或者您将下一行连接到其中,因为您认为这是一个不完整的行。

如果您想检测fget((ed缓冲区是否包含null,请在其前面填充chr 1,然后查看null是否已被覆盖。或者使用ftell查看读取的内容是否比缓冲区大小显示的要多。请记住,在windows上,由于行结束翻译,此计数可能会减少1,但如果您认为文本不包含行结束到null,那么这真的不是问题。

最新更新