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;
}

問題なくコンパイルおよびリンクされますが、改行はnullターミネータに置き換えられません。if()ステートメントが実行されていることを確認しました。助けてくれてありがとう!

4

2 に答える 2

12

getline読み取った文字数を返します。したがって、chars-1ではなくを使用する必要がありますchar

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

男getline(3)

成功するgetline()getdelim()、読み取った文字数を返します。これには、>区切り文字が含まれますが、終了ヌルバイトは含まれません。この値は、読み取られた行に埋め込まれたnullバイトを処理するために使用できます。

于 2012-10-21T17:05:44.887 に答える
4

の文字ではなく、最後の文字を確認して置換したい。

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

(終了する0文字を除いて、文字列の長さを返すのgetline()と同じように、読み取られた文字数を返します。)strlen()

于 2012-10-21T17:05:31.240 に答える