2016-05-08 4 views
2

これはおそらく非常に新鮮な質問ですが、\ rを除くすべての文字が新しい文字列ucontentsに追加されるように修正できますか?ちょうど今、\ rまで文字を追加します。 \ rの後に文字を追加したい。 r以外のすべての文字を新しい文字列に追加する

void to_unix_line_endings(char* contents, char* ucontents) { 
    int i; 
    for (i = 0; i < strlen(contents); i++) { 
    if(contents[i] != '\r') { 
     ucontents[i] = contents[i]; 
    } 
    } 
} 

char out[5000]; 
to_unix_line_endings("spaghettiand\rmeatballs", out); 
printf("%s\n", out); 
// Prints "spaghettiand". I want "spaghettiandmeatballs". 

ありがとうございます。

+2

'ucontents [i]は':代わりに 'i'の他のインデックス変数を使用しています。ヌルターミネータの最後に追加します。 – BLUEPIXY

+0

ありがとうございます。私はあなたの助言の下でそれをどのように修正したかを追加しました。ヌルターミネーターを正しく追加しましたか? –

答えて

2

、@BLUEPIXYはjlengthに等しくなることはありませんので、ucontentsはNULL if(j == length)ブロックで終了することはありませんことを指摘しています。

あなたのコード例(の回答のセクション)がそのままあなたのために機能するように見えますが、コードは最終的には失敗します。 printf()には、文字列の末尾を識別するヌルターミネータが必要です。書き込み先のメモリにNULL終端文字が正しく配置されていないと、失敗します。 (任意の文字列関数と同じように)。

次の変更は、あなたのバッファを終了ヌルます:

void to_unix_line_endings(char* contents, char* ucontents) { 
    int i; 
    int j = 0; 
    int length = strlen(contents);//BTW, good improvement over original post 
    for (i = 0; i < length; i++) { 
    if(contents[i] != '\r') { 
     ucontents[j] = contents[i]; 
     /*if (j == length) { //remove this section altogether 
     ucontents[j] = '\0'; 
     break; 
     }*/ 
     j++;//this increment ensures j is positioned 
      //correctly for NULL termination when loop exits 
    } 
    } 
    ucontents[j]=NULL;//add NULL at end of loop 
} 
+1

ありがとうございます。冗長ブロックを取り除くためにコードを変更しました。 –

1

このように修正されました。ありがとう、BLUEPIXY。 (あなたの答えの下で)コメントで

void to_unix_line_endings(char* contents, char* ucontents) { 
    int i; 
    int j = 0; 
    int length = strlen(contents); 
    for (i = 0; i < length; i++) { 
    if(contents[i] != '\r') { 
     ucontents[j] = contents[i]; 
     if (j == length) { 
     ucontents[j] = '\0'; 
     break; 
     } 
     j++; 
    } 
    } 
} 
+2

'j'は決して' length'になりません。 [サンプル](http://ideone.com/lzNZQS) – BLUEPIXY

+0

ありがとうございました。それは私がやったよりも良かった。私はC++からCへのプログラムを移植しています。 –

+1

@ SamSaint-Pettersen - あなたの 'if(j == length)'ブロックは決して実行されません。 (BLUEPIXYのコメントです) – ryyker

関連する問題