ギリギリ行けるお一人様のライン

C言語で、NULLとの比較を行う関数として、
strcmp関数を使用したいと考えています。

ある、文字列変数に、
"あいうえお"が入っている場合、
""(何もない)の場合、
下記の例で真の処理と偽の処理、
どちらを通るのでしょうか。
当然、文字列変数が"あいうえお"の場合は、
真の処理を通ると思いますが、
""(何もない)の場合が分かりません。

例として、

~中略~
if( strcmp( 文字列変数, NULL ) != 0 ){
真の処理
}else{
偽の処理
}
~中略~

の時です。

言語によって、NULLは「0」と定義されていたような
記憶もありますが・・
したい事は、文字列変数が""の場合、
偽の処理をするようにしたいです。

プログラムの作り方を教えて下さい。

A 回答 (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)
で良いと思います。
    • good
    • 0

補足2: NULLや0をポインタと見なした場合は、空ポインタとか無効ポインタとか言いますが「0番地」となる保障はありませんので、ご注意ください(Windowsなどでは、多分0番地になると思いますが)。

保障されているのは、他のデータや関数の参照に絶対にならない値、であることぐらいです。
    • good
    • 0

補足:これがうまくいくのは、文字列がASCIIなどの場合の話です。

ワイド文字などの場合は私も勉強しないと分かりません。
    • good
    • 0

空ポインタ(マクロNULLが使われるが、中身は0や(void*)0など)と、空文字'\0'と空文字列""は全然別物です。



C言語は昔経験がある程度なので自信はないのですが、strcmpは引数にNULLがあった場合の動作の保証はなかったような気がします(間違っていたらすみません)。
取り合えず、char *p; とした場合。
if( p == NULL || *p == '\0' ){
/* NULLまたは空文字列だった場合の処理 */
} else {
/* 空文字列でなかった場合の処理 */
}
で、strcmpを使わずとも、何とかなるとは思いますが。
なお、*p は p[0] でもよいです。
    • good
    • 0

No.6 です。


コピペミスしました。正しくは

プログラムコードとしては
if( strcmp( 文字列変数, "" ) != 0 )

if(文字列変数[0]!=0)
で良いと思います。

です。↓
    • good
    • 0

C言語のNULLは「(int)0」とかNULキャラクタとかではなくNULLポインタです。


混同して勘違いをしないようにね。
    • good
    • 0

C++は知らないので、昔ながらのC言語についての解答です。



例として記載されているコーディングの NULL の使い方が間違っています。
  誤: strcmp( 文字列変数, NULL )
  正: strcmp( 文字列変数, "" )

"誤"のコーディングでは、0番地という値がパラメータとして渡されます。strcmp関数は0番地にある文字列と比較することになりますが、たいていそこは(あなたがコーディングしているこのプログラムにとっては)でたらめな文字列になっています。
"正"のコーディングは、ヌル文字列のアドレスがパラメータとして渡され、意図どおりの結果を返してくれます。

ただし、もしかしたらコンパイラによっては、"誤"のコーディングでも"正"と同じ解釈をするようにstrcmp関数が作られているものがあるかも知れません(つまり方言です)。しかし仮にそうであっても、"正"のコーディングのように、本来の意味どおりのコーディングを心がけるべきです。
    • good
    • 0

#1です。


空文字列は、先頭が'\0'になっている文字列ですから、
例えばstrが空文字列かどうかを調べるには、
 if(str[0] == '\0')
でもできます。


ついでに、
strを空文字列にするには
 str[0] = '\0'
で良いです。
    • good
    • 0

Shift-JISの場合。



"あいうえお" → 82 A0 82 A2 82 A4 82 A6 82 A8 00
""(NULL) → 00

の比較。
    • good
    • 0

NULLポインタと空文字列は違います。


空文字列は
 char str[] = {'\0'};
なので(右辺は""でも良い)、
空文字列へのポインタは'\0'が格納されているどこか有効な領域を指します。

> strcmp( 文字列変数, NULL )
は、NULLが有効な領域を指していないため誤りです。

空文字列と比較するなら
 strcmp( 文字列変数, "" )
とします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報