4

だから私はそれを読んだ:

char pattern[] = "ould";

基本的にはより簡単な書き方です:

char pattern[] = { 'o', 'u', 'l', 'd', '\0' };

null 文字が文字列の終わりを示すことは理解しています\0が、次のように書くとどうなるでしょうか。

char pattern[] = { 'o', 'u', 'l', 'd'};(\0 なし)

それはまだコンパイルされます。

警告なしでコンパイルされているように見えるため、問題の原因がpatternなければどこに問題がありますか ( )\0-Wall

4

8 に答える 8

12

終端のゼロを残すと、null 終端の文字列がなくなり、配列だけcharになるため、文字列を期待する関数に渡すとエラーになります。たとえばstrlen、 へのソース パラメータとして、フォーマット指定子を含む へのパラメータstrcpyとして、など。...printf%s

于 2011-02-26T13:07:14.197 に答える
3

この動作の何が問題になっていますか? 最後に '\0' のない char 配列を持つことは完全に有効です。それは単なる配列です。「\0」が存在する唯一の理由は、文字列を区切るためです。長さが分かっていれば、必要ありません!

Char 配列は、他の配列と比べて特別ではありません。'\0' が必要なのは、標準の文字列関数だけです。

于 2011-02-26T13:06:55.793 に答える
2

これはコンパイラの警告ではなく、論理的なものです。strcpyなしで使用する\0と、スタックが破損する可能性があります。

于 2011-02-26T13:07:27.020 に答える
2

コンパイラで問題が発生することはありません。問題が発生するのは、多くの関数です。たとえばprintf、%s 形式指定子を使用して何かを渡すと、'\0' で終了すると仮定します。

ただし、その配列を自分が作成した関数に渡すだけの場合、または配列の長さを別のパラメーターとして渡す場合、それらはすべてそれがどれくらいの長さであるかを知っているため、問題は発生しません。

于 2011-02-26T13:07:52.613 に答える
2
char string[] = "abcd"; /*is valid at the end is the \0, 5 chars were allocated*/

char str[3] = {'\0'}; /* all are \0 */

strncpy(str, string, 2); /*strcpy doesn't add \0*/

str[3] = '\0'; /* now is everything fine! */
于 2011-02-26T13:10:13.733 に答える
1

文字列として扱うと問題になります。たとえば、strcmp、strcpy、printf を使用します。それらはすべて null ターミネータを見つけることを期待しているため、間違いなく問題が発生します。

文字の配列として扱うだけであれば、昔ながらの文字配列でも問題ありません。例えば

char c = pattern[2];
于 2011-02-26T13:07:39.063 に答える
1

もちろんコンパイルできます。これは有効な C プログラムです。null で終わる文字列 ('\0' で終わる文字の配列) を期待する関数に文字配列を渡そうとすると、問題が発生します。

于 2011-02-26T13:09:02.703 に答える
1

たとえば、文字列の長さを取得すると、予測できない結果が生じます。
strlen(pattern)

于 2011-02-26T13:09:21.947 に答える