私はCで次のプログラムを持っています:
プログラムの主な問題は、コピー操作を実行した後、コピーされた文字の後に多数のごみ文字が表示されることです。これは、宛先変数が適切にnullで終了していないためです。ただし、コードを注意深く調べると、null終了を実行しています。なぜまだ問題があるのですか?
私はCで次のプログラムを持っています:
プログラムの主な問題は、コピー操作を実行した後、コピーされた文字の後に多数のごみ文字が表示されることです。これは、宛先変数が適切にnullで終了していないためです。ただし、コードを注意深く調べると、null終了を実行しています。なぜまだ問題があるのですか?
strlen()
では、文字列の長さをどのように計算すると思いますか? 解約が必要だと思いますか?
ヒント:あります。文字の配列は、0 文字で終了しない限り、C の文字列ではありません。ターミネータstrlen()
が見つかるまで文字数をカウントするだけなので、文字列にするためにバッファを終了するロジックで使用することは、鶏卵のような状況です。
あなたの問題は、あなたが誤用していることですstrncpy()
。この関数は、典型的な (初心者の) C プログラマーの観点からは少しおかしいので、これは非常に簡単に間違ってしまいます。名前からして、あなたが期待することをするだけではありません。
次のことが確実である限り、おそらくこれを手動で行う必要がありますnob < sizeof destination - 1
。
memcpy(destination, source, nob);
destination[nob] = '\0';
strcpy
マシュー、コピーしている文字列の長さが既にわかっている場合は、 orは必要ありませんstrncpy
(末尾の \0 を探して各文字をチェックします)。代わりにmemcpy
、新しい文字列を使用してから終了する必要があります。
memcpy(destination, source, nob);
destination[nob] = '\0';
memcpy
'\0' をチェックしないので、より高速です。
それ以外の:
destination[strlen(destination)] = '\0';
持ってる:
destination[nob] = '\0';
strlen
'\0'
文字が見つかるまで読み続けます。
strncpy
destination
コピー後に文字列が null で終了することを保証するものではありません。私のアプローチは次のとおりです。
destination[ nob ] = '\0';
strncpy は使用しないでください。明らかに危険です。あなたの例からわかるように、プログラマーは常に正しいパラメーターを入力するのを忘れており、その結果、文字列が破損しています。これは非常に一般的なバグです。
strcpy() はより安全ですが、境界チェックがないため理想的ではありません。誤って使用すると、セキュリティ上の問題であるバッファ オーバーフローが発生する可能性があります。これもよくあるバグです。
文字列をコピーする最も速くて安全な方法は、memcpy を使用することです。
memcpy(destination, source, nob);
desitnation[nob] = '\0';
これは、いくつかの非常に小さな変更の後、うまく機能します。
char destination[18] = {'\0'};
strncpyは最初のnob文字のみをコピーし、末尾に0を追加しないため、これは失敗しています。目的の文字列にstrlen()を使用して末尾の 0 を追加しようとしても役に立ちません。最初の 0 まで文字をカウントし、その場所にゼロを配置するためです (これは効果がありません)。
修正を「ハック」する 1 つの方法は、宛先文字列をクリアすることです。
memset( destination, 0, sizeof(destination));
> 17のテストを> 18にするなど、おそらくはるかに優れたソリューションがあります。