すべての文字列を文字の配列と見なすことができますか(はい)、すべての文字配列を文字列と見なすことができます(いいえ)。
何故なの?そして、なぜそれが重要なのですか?
文字列の長さが文字列の一部としてどこにも保存されないことを説明する他の回答と、文字列が定義されている標準への参照に加えて、裏側は「Cライブラリ関数は文字列をどのように処理するか」です。
文字配列は同じ文字を保持できますが、最後の文字の後にヌル終了文字が続いていない限り、それは単に文字の配列です。そのNUL終了文字は、文字の配列を文字列と見なす(扱う)ことを可能にする文字です。
文字列を引数として期待するCのすべての関数は、文字シーケンスがヌル文字で終了することを期待しています。どうして?
すべての文字列関数が機能する方法に関係しています。長さは配列、string-functionsの一部として含まれていないため、nul文字(たとえば、'\0'
、decimalに相当0
)が見つかるます。ASCIIテーブルと説明を参照してください。かかわらず、あなたが使用しているかどうかstrcpy
、strchr
、strcspn
、など。すべての文字列関数は、に依存しているNUL終端その文字列の終わりがどこにあるかを定義するために存在している文字。
からの2つの類似した関数の比較はstring.h
、NUL終了文字の重要性を強調します。例えば:
char *strcpy(char *dest, const char *src);
strcpy
単にコピー機能からバイトsrc
へdest
は、nullで終了する文字が見つかりstrcpy
、文字のコピーを停止する場所を指示まで、コピーします。次に、同様の関数を実行しますmemcpy
。
void *memcpy(void *dest, const void *src, size_t n);
関数は同様の操作を実行しsrc
ますが、パラメーターを文字列と見なしたり、パラメーターを必要としたりしません。までバイトをコピーするmemcpy
だけでは順方向にスキャンできないので、src
dest
nul終了文字に到達、3番目のパラメーターとしてコピーするバイト数を明示的に要求します。この3番目のパラメーターは、null終了文字が見つかるまで前方にスキャンするだけでmemcpy
同じサイズの情報strcpy
を取得できます。
(これはstrcpy
、関数に文字列を提供するのに失敗した場合、何が悪いのか(または文字列を期待する関数)を強調します) nullで終了する文字列をます-どこに停止ず、残りのメモリセグメント全体でうまく競合します。メモリ内のどこかでヌル文字が偶然見つかるまで、またはセグメンテーション違反が発生するまで、未定義の動作を呼び出す)
つまり、なぜ期待機能NUL終端文字列が渡されなければなりませんNUL終端文字列をし、なぜそれが重要。
char str[] = "hello";
事件に言及すべきです。