如果返回 NULL,则由 fgets 保证空终止
Null-termination guarantees by fgets if NULL is returned
在阅读 C99 草案时 ISO/IEC 9899:TC2 WG14/N1124,我偶然发现了一些令我担心的陈述:
如果fgets
returnsNULL
,给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,因为他们正在使用 errno
,fgets
没有义务设置。但我不确定我是否误解了这一点。
您对标准的理解正确。如果出现错误,该函数将 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.
在阅读 C99 草案时 ISO/IEC 9899:TC2 WG14/N1124,我偶然发现了一些令我担心的陈述:
如果fgets
returnsNULL
,给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,因为他们正在使用 errno
,fgets
没有义务设置。但我不确定我是否误解了这一点。
您对标准的理解正确。如果出现错误,该函数将 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.