如果返回 NULL,则由 fgets 保证空终止

Null-termination guarantees by fgets if NULL is returned

在阅读 C99 草案时 ISO/IEC 9899:TC2 WG14/N1124,我偶然发现了一些令我担心的陈述:

如果fgetsreturnsNULL,给fgets的string/buffer是否也保证以null终止?

§7.19.7.2 说明中的状态

A null character is written immediately after the last character read into the array.

但在return下:

If a read error occurs during the operation, the array contents are indeterminate and a null pointer is returned.

因此,在我的解释中,最后一个陈述暗示在任何 NULL-returning 情况下都不会给出此保证。 我已经准备更正 http://en.cppreference.com,因为他们正在使用 errnofgets 没有义务设置。但我不确定我是否误解了这一点。

您对标准的理解正确。如果出现错误,该函数将 return NULL 并且缓冲区的内容不可信。

这允许 fgets 直接读入目标缓冲区,中间没有任何双缓冲区。因此,如果在预期数据中途出错,它可能会停止并且 return NULL。

还要注意这个特殊情况 (7.21.7.2):

If end-of-file is encountered and no characters have been read into the array, the contents of the array remain unchanged and a null pointer is returned.