これら 2 つのインスタンスは、null ターミネータを自動的に追加することを知っています。
char test[100] = "Null terminator will follow me";
と
/*...String already initialised*/
sprintf(test,"Null terminator will follow me");
しかし、通常の C の使用法では、他にどこでこれが起こるでしょうか?
まず、nullポインタ定数NULL
に展開するマクロです。その用語を使用してヌル文字を参照すると、せいぜい混乱を引き起こし、最悪の場合は誤ったコードを引き起こします。
'\0'
C文字列は、「NUL」と呼ばれることもあるヌル文字で終了します。これは、C標準の「文字列」という単語の定義の一部です。
文字列は、最初のヌル文字で終了し、それを含む文字の連続したシーケンスです。
ほとんどすべての文字列リテラル(文字で区切られて"
いる)には、明示的なターミネータがある場合でも、暗黙的にnullターミネータが含まれています。例えば:
"abc\0def"
次の内容の配列を参照します。
{ 'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0' }
これに対する1つの例外は、文字列リテラルが、リテラルとまったく同じ長さの配列の初期化子として使用される場合です。
char nonterminated[5] = "12345";
(C ++にはこの特殊なケースがなく、上記の宣言は違法になります。)
str*()
で宣言されている関数のほとんどは、適切<string.h>
に使用すると、適切にnullで終了する文字列を提供します。(この関数は注目すべき例外です。回避することをお勧めします。)strncpy()
ドキュメントに「文字列」を扱うと記載されている関数は、適切にnullで終了する文字列を必要とするか生成します(関数とそのドキュメントの両方が正しいと仮定します)。
二重引用符は、終端のヌル文字を意味します。あなたが書くなら
char mystr[5] = {'A', 'B', 'C', 'D', 'E'};
終了はありません。ただし、次のように書く場合は注意してください。
char mystr[5] = {'A', 'B', 'C'};
初期化子から除外された要素は暗黙的に 0 に設定されるため、文字列も null で終了します。
C で "This is a string" 表記を使用する場合は常に、最後の文字が '\0' である文字配列へのポインターを意味します。
1) すべての文字列リテラルは、暗黙的にヌル ターミネータを取得します。
2) 多くの C ライブラリ関数は、結果を自動的に null で終了します。たとえば、sprintf 関数はすべての引数を出力してから、null ターミネータを追加します。通常、c ライブラリの文字列コピー関数は同じことを行います。