size_t 与 0 比较无效,与 -1 比较有效

size_t comparison to 0 does not work, comparison to -1 does

我正在尝试编写极其简单的代码来从标准输入读取输入,一次一行。

代码

size_t size = 0;
size_t length = 1;
char* text = NULL;

while (length > 0) {
    length = getline(&text, &size, stdin);
}

length = -1 时不在 EOF 处终止,而

while (length != -1) {
    length = getline(&text, &size, stdin);
}

会。

这怎么可能?谢谢

问题在这里:

size_t length = 1;

getline()的return是ssize_t,不是size_t

ssize_t 用于可以 return 负 错误 指示的函数(例如 -1 每个 getline() 的定义) 或正 byte 值。 size_t 应仅用于限于 return 正 byte 值的函数。

使用 ssize_t length = 1; 作为替换声明。

Aside - 在您的示例中,您使用 EOF 来帮助描述您意外丢失的错误情况。正如@Jonathan Leffler 在评论中指出的那样,值得注意的是,因为它被标记为 C(而不是 C++),并且因为 getline() 不是标准 C 库的一部分,所以它必须是GNU 扩展或 POSIX 实现。两者都将 return 错误条件明确定义为 -1 而不是 EOF.

  • GNU - "如果发生错误或到达文件末尾但未读取任何字节,getline returns -1。"
  • POSIX - "...两个函数 return -1 读取一行失败..."(另一个是 getdelim().)

这个有趣的事实的重要性被最小化,因为没有系统将 EOF 定义为 -1 以外的任何东西。 :)