"fgets will not stop if it encounters a NUL" 是什么意思

What does it mean by "fgets will not stop if it encounters a NUL"

所以,我在 Whosebug

上看到了下面的答案

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

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

“fgets遇到NUL不会停止”是什么意思?请用简单的代码片段解释一下。

Link: Why is the fgets function deprecated?

按照惯例,C 中的字符串是 "NUL-terminated"。这意味着字符串的结尾由 "NUL" 字符的存在决定。 NUL 字符是字符 '[=10=]' 或更具体地说是值为 0 的 char。所有 C 字符串文字都是以 NUL 结尾的,并且大多数 C API 接受字符串(都在标准库和大多数其他用 C 编写的库)期望这些字符串以 NUL 终止。

意味着 NUL 字符不能用作 API 中期望 NUL 终止的正常数据值。那些 API 将 NUL 字符视为字符串的结尾,而不是字符串数据的有意义部分。例如,strlen("foo[=12=]bar") 是 3,而不是 7。

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

这就是 post 警告的内容:fgets 不会将 NUL 字符与任何其他字符区别对待,而大多数其他 C API 函数会这样做。因此,如果您将 fgets 生成的字符串传递给某些需要 NUL 终止的 API,如果该文件包含 NUL 字符,您可能会遇到问题。

Fgets 仅适用于文本文件。为什么文本文件中会有空值? 所以对于大多数用途来说,它是完美的。在最坏的情况下,您看不到空字符之后的内容,或者您​​将下一行连接到其中,因为您认为它是不完整的行。

如果你想检测你的 fget()ed 缓冲区包含空值,用 chr 1 预填充它,然后查看空值以查看 chr1 是否已被覆盖。或者使用 ftell 查看读取的内容是否超过缓冲区大小。 请记住,在 windows 上,由于行结束翻译,此计数可能会减少 1,但如果您认为文本确实/不/包含直到 null 的行结束,那么这不是问题,真的。