删除换行符的功能没有效果?

时间:2012-10-21 17:02:00

标签: c

我编写了一个函数来包装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()语句是否正在运行。谢谢你的帮助!

2 个答案:

答案 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字符。)