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
以外的任何东西。 :)
我正在尝试编写极其简单的代码来从标准输入读取输入,一次一行。
代码
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
以外的任何东西。 :)