C のプログラムについてちょっとばかげた質問があり ます。理由は本当にわかりません。画面に各文字を書きたいだけです。
私のコード:
int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != NULL) {
putchar(str[i]);
i++;
}
助けてください。インターネット上で有用な答えが見つかりませんでした。
NULL
はポインターでstr[i]
あり、str 配列の i 番目の文字です。char は整数型であり、それらを比較すると警告が表示されます。
文字列の終わりをチェックしたいと思います。それは、値が 0 (文字列の終わり) の文字、つまり'\0'
.
しかし、これは、文字列としてではなく、文字の配列として定義し、文字配列で終端の 0 を定義しなかったため、役に立ちません (そこで暗黙的であることは幸運です)。
PS: 次回は、少なくともコンパイラが不平を言っている情報を提供する必要があります。
NULL はポインター コンテキストでのみ使用する必要がありますが、ここでは文字と比較しています。
通常、次のようなものが必要です。
while (str[i] != '\0') {
[または、もちろん、puts(str);
またはのようなものprintf("%s", str);
]
そのコードの最大の問題は、実装によっては、エラーなしでコンパイルされる可能性があることです。
他の人が言ったように、問題は、null文字値ではなく、 nullポインターNULL
値を表すことを意図していることです。null 文字を示すために使用します。(または、同等ですが、より明確に意図を表現する を使用できます。)'\0'
0
'\0'
NULL
実装定義のnull ポインター定数に展開されるマクロです。NULL ポインター定数は、値が の整数定数式0
、または にキャストされた式のいずれかvoid*
です。つまり、 asまたは as (他のバリエーションの中でも) のNULL
いずれかで定義できます。0
((void*)0)
どうやらあなたの実装はそれを次のよう((void*)0)
に定義しているようです。そのため、警告メッセージが表示されました。(それは致命的なエラーとして扱われる可能性があり、IMHO はそうすべきです)。
したがってNULL
、null ポインター定数として以外に使用しようとしないでください。また、誤用した場合にコンパイラーが警告することを当てにしないでください。
str[i] の値を、ポインターと見なされる NULL ではなく、文字列の末尾の '\0' と比較する必要があります。君の
while (str[i] != NULL ) {
に変更
while (str[i] != '\0') {
下:
int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != '\0') {
putchar(str[i]);
i++;
}
str[i]
キャラクターです。NULL
ポインタです。これらの2つのデータ型を有意義に比較することはできません(ただし、内部で同じサイズの整数として実装されている場合とされていない場合があります)。エラーメッセージの意味はこれだけです。
比較がタイプが正しくないだけでなく、おそらくあなたが意味することもしません。初期化子が不完全な文字配列は自動的に\0文字で終了すると想定しているようですが、その規則は、自分で作成した文字配列ではなく、文字列リテラルに適用されます。現状では、未定義の動作を呼び出しています。
NULL
はポインタ型として定義され、通常は(void*)0
. これは、文字 (単独で使用すると整数に昇格される) と比較してはならないことを意味します。問題は次のとおりですstr[i] != NULL
。これを行う正しい方法は、それを同じタイプのものと比較することです。この場合、null 文字を探しています'\0'
。
ここで、str[i] は文字で、NULL はポインターであるため、論理的に比較することはできません。str[i] はヌル文字として定義されているため、'\0' を使用して str[i] と比較します。そのため、文字 str[i] をヌル文字 '\0' と比較することは正しい方法であり、警告は表示されません。
このようにコードを書いてください
int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != "\0") {
putchar(str[i]);
i++;
}