- ベストアンサー
NULLの定義について
- C言語で、NULLとの比較を行う関数として、strcmp関数を使用したいと考えています。
- 文字列変数に「あいうえお」が入っている場合、何もない場合、真の処理と偽の処理を通るか分かりません。
- NULLは「0」と定義されている場合がありますが、文字列変数が何もない場合に偽の処理をするプログラムの作り方を教えてください。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
#define NULL 0 VC++だとシステムで上の定義があるように、NULL=0です。 先に回答されている方のおっしゃる通り、NULLポインタとNULL文字列は扱いが違います。 文字列はchar配列でNULL=0が来るまでを文字とみなすので、配列の最初に0が来ると、文字なしの文字列となります。 ポインタでも数値でも文字列でも、NULL=0です。メモリ上は同じです。その領域をどのデータ型にあてはめて参照するかで、見方が変わるだけです。 > strcmp( 文字列変数, NULL ) はアドレス0の文字列を参照してしまうので、アドレス0にたまたま”あいうえお"が入っていれば条件は真となりますが、たいていは入っていないので0が来るまで文字列として参照し続けて落ちてしまうこともあり得ます。 プログラムコードとしては if( strcmp( 文字列変数, NULL ) != 0 ) か if(文字列変数[0]!=0) で良いと思います。
その他の回答 (9)
補足2: NULLや0をポインタと見なした場合は、空ポインタとか無効ポインタとか言いますが「0番地」となる保障はありませんので、ご注意ください(Windowsなどでは、多分0番地になると思いますが)。保障されているのは、他のデータや関数の参照に絶対にならない値、であることぐらいです。
補足:これがうまくいくのは、文字列がASCIIなどの場合の話です。ワイド文字などの場合は私も勉強しないと分かりません。
空ポインタ(マクロNULLが使われるが、中身は0や(void*)0など)と、空文字'\0'と空文字列""は全然別物です。 C言語は昔経験がある程度なので自信はないのですが、strcmpは引数にNULLがあった場合の動作の保証はなかったような気がします(間違っていたらすみません)。 取り合えず、char *p; とした場合。 if( p == NULL || *p == '\0' ){ /* NULLまたは空文字列だった場合の処理 */ } else { /* 空文字列でなかった場合の処理 */ } で、strcmpを使わずとも、何とかなるとは思いますが。 なお、*p は p[0] でもよいです。
- fruipa
- ベストアンサー率38% (14/36)
No.6 です。 コピペミスしました。正しくは プログラムコードとしては if( strcmp( 文字列変数, "" ) != 0 ) か if(文字列変数[0]!=0) で良いと思います。 です。↓
C言語のNULLは「(int)0」とかNULキャラクタとかではなくNULLポインタです。 混同して勘違いをしないようにね。
- saisho_wa_goo
- ベストアンサー率32% (31/96)
C++は知らないので、昔ながらのC言語についての解答です。 例として記載されているコーディングの NULL の使い方が間違っています。 誤: strcmp( 文字列変数, NULL ) 正: strcmp( 文字列変数, "" ) "誤"のコーディングでは、0番地という値がパラメータとして渡されます。strcmp関数は0番地にある文字列と比較することになりますが、たいていそこは(あなたがコーディングしているこのプログラムにとっては)でたらめな文字列になっています。 "正"のコーディングは、ヌル文字列のアドレスがパラメータとして渡され、意図どおりの結果を返してくれます。 ただし、もしかしたらコンパイラによっては、"誤"のコーディングでも"正"と同じ解釈をするようにstrcmp関数が作られているものがあるかも知れません(つまり方言です)。しかし仮にそうであっても、"正"のコーディングのように、本来の意味どおりのコーディングを心がけるべきです。
- Werner
- ベストアンサー率53% (395/735)
#1です。 空文字列は、先頭が'\0'になっている文字列ですから、 例えばstrが空文字列かどうかを調べるには、 if(str[0] == '\0') でもできます。 ついでに、 strを空文字列にするには str[0] = '\0' で良いです。
Shift-JISの場合。 "あいうえお" → 82 A0 82 A2 82 A4 82 A6 82 A8 00 ""(NULL) → 00 の比較。
- Werner
- ベストアンサー率53% (395/735)
NULLポインタと空文字列は違います。 空文字列は char str[] = {'\0'}; なので(右辺は""でも良い)、 空文字列へのポインタは'\0'が格納されているどこか有効な領域を指します。 > strcmp( 文字列変数, NULL ) は、NULLが有効な領域を指していないため誤りです。 空文字列と比較するなら strcmp( 文字列変数, "" ) とします。