size_t与0的比较不起作用,与-1的比较

问题描述

我正在尝试编写极其简单的代码以一次从stdin读取输入。

代码

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,stdin);
}

确实。

这怎么可能?谢谢。

解决方法

问题在这里:

size_t length = 1;

getline()的返回值是ssize_t,而不是size_t

ssize_t用于可返回负 error 指示(例如,-1的每个定义为getline())或正数byte的函数。值。 size_t仅应用于限制返回正byte值的函数。

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

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

  • GNU-“如果发生错误或到达文件末尾而没有读取任何字节,则getline返回-1。”
  • POSIX-“ ...两个函数在读取行失败时都返回-1 ...” (另一个是getdelim()。)

由于没有EOF被定义为-1以外的任何系统,因此这一有趣事实的重要性被最小化。 :)