3

我编写了一个函数来包装 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;
}

它编译和链接没有问题,但换行符不会被空终止符替换。我已经验证 if() 语句正在运行。谢谢你的帮助!

4

2 回答 2

12

getline返回读取的字符数。所以你必须使用chars-1而不是char.

if ((*lineptr)[chars - 1] == '\n') 
  {
      (*lineptr)[chars - 1] = '\0';
      --chars;
  }

男人getline (3)

成功时,getline()返回getdelim()读取的字符数,包括 > 分隔符,但不包括终止空字节。该值可用于处理读取的行中嵌入的空字节。

于 2012-10-21T17:05:44.887 回答
4

您要检查并替换最后一个字符,而不是后面的那个。

if ((*lineptr)[chars - 1] == '\n') {
    (*lineptr)[chars - 1] = '\0';
}

getline()返回读取的字符数,就像strlen()返回字符串的长度一样,不包括终止的 0 字符。)

于 2012-10-21T17:05:31.240 回答