getline()与getdelim()是否可能返回0?
关于getline()和getdelim()返回值的疑问解答
未到达文件末尾时,这两个函数可能读取0个字符
当输入流的当前读取位置直接遇到指定分隔符时,getline()(默认分隔符为换行符\n)和getdelim()会消耗这个分隔符,但不会将其存入目标缓冲区,此时返回的读取字符数为0。这种情况不属于文件结束(EOF)或错误,是完全合法的正常行为。举个代码示例:
#include <stdio.h> #include <stdlib.h> int main() { char *buf = NULL; size_t buf_size = 0; ssize_t result; // 模拟输入流开头就是换行符的场景(比如通过`echo -e "\nabc"`输入) result = getline(&buf, &buf_size, stdin); printf("第一次调用getline返回值:%zd,读取内容:'%s'\n", result, buf); // 此时result为0,buf是空字符串(未读取到分隔符外的字符) result = getline(&buf, &buf_size, stdin); printf("第二次调用getline返回值:%zd,读取内容:'%s'\n", result, buf); free(buf); return 0; }运行后会看到第一次调用
getline()返回0,这就是未到EOF但读取0字符的典型场景。绝对不能假设它们的返回值一定非零
由于存在上述合法返回0的情况,代码中必须处理返回值为0的场景,不能默认返回值要么是正数要么是-1。忽略这种情况可能导致逻辑错误,比如跳过空行处理、错误判断流状态等。
内容的提问来源于stack exchange,提问作者raygard
相关产品推荐
相关产品推荐

