所以,我在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("foo bar")
是3,而不是7。
CCD_ 6从文件流中读取字符数据。但该文件可以包含NUL字符。该帖子所说的是,fgets
将像对待任何其他字符一样对待文件中的NUL字符。fgets
会以NUL终止给定的字符串,但如果文件包含NUL字符,fgets
会尽职尽责地读取它们。
这就是帖子所警告的:fgets
不会将NUL字符与任何其他字符区别对待,而大多数其他C API函数都会这样做。因此,如果您将fgets
生成的字符串传递给某个要求NUL终止的API,则如果该文件包含NUL字符,则可能会出现问题。
如果您想检测fget((ed缓冲区是否包含null,请在其前面填充chr 1,然后查看null是否已被覆盖。或者使用ftell查看读取的内容是否比缓冲区大小显示的要多。请记住,在windows上,由于行结束翻译,此计数可能会减少1,但如果您认为文本不包含行结束到null,那么这真的不是问题。