1

私が扱っている配列は次のとおりです。

char arr[91][12];

したがって、次のように for ループを使用してファイルから配列を作成します。

for(i = 0; fgets(arr[i], 12, inFile); i++){}

その配列から何かを印刷したいときは、自動的に次の行にエスケープします。

その配列をテストするには:

for(i = 0; fgets(arr[i], 12, inFile); i++){
    printf("%s", arr[i]);
}

//one
//two
//three etc.

//want it to be 'one two three etc.'

配列内の各文字列strpbrk()を検索して、次のように変更しようとしています。\n\0

for(i = 0; fgets(arr[i], 12, inFile); i++){
if(strpbrk(arr[i], "\n") != NULL ){
    arr[i][strpbrk(arr[i], "\n")] = '\0';
    }
printf("%s", arr[i]);
}

しかし、これは私にエラーを与えます。私がやろうとしていることを行うためのより良い方法はありますか?

4

3 に答える 3

5

実際、あなたが思っているよりもずっと簡単です。改行が最後にある場合(で読み取る場合のようにfgets)、最後の文字を文字列ターミネータに変更します。

arr[i][strlen(arr[i]) - 1] = '\0';

これ-1は、配列(文字列など)がゼロからインデックス作成を開始し、に進むためlength - 1です。


あなたが本当に改行を持ってstrpbrkいることを確認するために、あなたは例えばあなたがするように使うことができます(しかしもちろん他の答えで説明されているようにあなたがそれをする方法ではありません)。しかし、私はそれを使用する方が良いと思いますstrrchr。1つ目は単純であるため(文字列ではなく文字のみを検索するため)、2つ目は最後から検索を開始するためです。

char *newlineptr = strrchr(arr[i], '\n');
if (newlineptr != NULL)
    *newlineptr = '\0';

またはすべての最速の方法:

size_t length = strlen(arr[i]);
if (arr[i][length - 1] == '\n')
    arr[i][length - 1] = '\0';
于 2013-02-20T02:14:14.463 に答える
4

strpbrk()改行へのポインターを返すため、一度だけ使用する必要があります。

char *nl;

if ((nl = strpbrk(arr[i], "\n")) != NULL)
    *nl = '\0';

または、改行が文字列の最後の文字になるため、これも機能します。

size_t len = strlen(arr[i]);
if (arr[i][len-1] == '\n')
   arr[i][--len] = '\0';

これは、改行があるかどうかをチェックすることに注意してください。改行をまだ読み取っていなくてもfgets()、 NUL 以外のスペースがなくなると読み取りを停止します。'\0'これにより、文字列の長さもわかります(strpbrk()間接的にそうです;それはですnl - arr[i] - 1)。strpbrk()とその相対strcspn()は よりも複雑であることに注意してくださいstrlen()

于 2013-02-20T02:16:13.677 に答える
3

strpbrkへのポインタを返します'\n'。だから変更:

arr[i][strpbrk(arr[i], "\n")] = '\0';

に:

*strpbrk(arr[i], "\n") = '\0';
于 2013-02-20T02:13:45.297 に答える