在阅读 C99 草案 ISO/IEC 9899:TC2 WG14/N1124 时,我偶然发现了一些让我担心的陈述:
如果fgets
返回NULL
,提供给fgets
的字符串/缓冲区是否也保证以 null 终止?
§7.19.7.2 描述中的状态
一个 空字符在读入数组的最后一个字符之后立即写入。
但在返回下:
如果在操作过程中发生读取错误,则数组内容为 不确定,并返回空指针。
因此,在我的解释中,最后一句话暗示,在任何NULL
返回的情况下都没有提供这种保证。我已经要纠正 http://en.cppreference.com 了,因为他们正在使用errno
,fgets
没有义务设置。但我不确定我是否误解了这一点。
您正确解释标准。如果出现错误,该函数将返回 NULL,并且缓冲区的内容不受信任。
这允许fgets
直接读取目标缓冲区,中间没有任何双缓冲区。因此,在预期数据中途出错时,它可能只是停止并返回 NULL。
另请注意此特殊情况 (7.21.7.2):
如果遇到文件末尾并且没有字符被读入 数组,数组的内容保持不变,为 null 返回指针。