我编写了一个函数来包装GNU getline()并删除尾部换行符,但由于某种原因它没有效果。我做错了吗?
ssize_t readline(char **lineptr, FILE *stream)
{
size_t len = 0; // Size of the buffer, ignored.
ssize_t chars = getline(lineptr, &len, stream);
if((*lineptr)[chars] == '\n') {
(*lineptr)[chars] = '\0';
--chars;
}
return chars;
}
它编译和链接没有问题,但换行符不会被替换为null终止符。我已经验证了if()语句是否正在运行。谢谢你的帮助!
答案 0 :(得分:11)
getline
返回读取的字符数。因此,您必须使用chars-1
而不是char
。
if ((*lineptr)[chars - 1] == '\n')
{
(*lineptr)[chars - 1] = '\0';
--chars;
}
man getline(3)
成功时,
getline()
和getdelim()
会返回读取的字符数,包括>分隔符,但不是 包括终止空字节。该值可用于处理 读取行中的嵌入空字节。
答案 1 :(得分:4)
您想要检查并替换最后一个字符,而不是之后。
if ((*lineptr)[chars - 1] == '\n') {
(*lineptr)[chars - 1] = '\0';
}
(getline()
返回读取的字符数,就像strlen()
返回字符串的长度一样,不包括终止0字符。)