0

私は C 入門書プラス第 5 版を読んでいて、I/O の章にいます。いくつかのことを行う例 (451 ページ) を思いつき、ある時点で、既存のファイルにちなんで名付けられた新しいファイルを作成しますが、末尾は .red です。たとえば、このファイル「test」がある場合、プログラムは「test.red」を作成します。以下が理解できません..

char name[LEN];
//some code...

strncpy(name,argv[1], LEN - 5);
name[LEN - 5] = '\0';
strcat(name,".red");

コマンド strcpy の定義を調べました。arv[1] (ソース ファイルを含む) から最初の LEN-5 文字を名前にコピーします。strcat コマンドは .red を末尾に追加します。しかし、これの存在が理解できませんname[LEN - 5] = '\0';。私はそれを削除しましたが、プログラムはまだうまく機能しています。
EDIT
これらの行の本からのコメントを投稿します..

出力ファイルの新しい名前を作成するために、プログラムは strncpy() を使用して名前 eddy を配列 name にコピーします。LEN - 5 引数は、.red サフィックスと最後のヌル文字のための余地を残します。argv[2] 文字列が LEN – 5 よりも長い場合、ヌル文字はコピーされないため、プログラムは念のためヌル文字を追加します。strncpy() 呼び出しの後の名前の最初のヌル文字は、strcat() 関数がその文字列を追加するときに .red のピリオドで上書きされ、この場合は eddy.red が生成されます。

4

1 に答える 1

1

C では、文字列は単なる文字の配列です。文字列の末尾を知るために、最後の文字の後に '\0' 文字 (ASCII アルファベットでは NUL 文字と呼ばれる文字コード 0 の文字) が追加されます。

strncpy は、3 番目の引数で指定された文字数を最大でコピーし、コピーが NUL で終了するという保証はありません。strncpy が設計された当時、ストレージは今日よりも限られており、1 バイトでさえ重要でした。たとえば、特定の文字列の最大文字数が 14 文字であることがわかっている場合、14 文字の文字列を終端の NUL 文字なしで格納できます。

そのため、strncpy を使用する場合、文字列のコピーを strcat などの他の C 関数で使用する場合、strncpy がコピーしなかった場合は、不足している NUL 文字を追加する必要があります。

最初からその場所に NUL 文字があったとしても、とにかくうまくいくかもしれませんが、それはあなたが頼りにするものではなく、コンパイラーがあなたを助けるものでもありません。

于 2014-01-14T09:38:42.723 に答える