NULLの定義について

このQ&Aのポイント
  • C言語で、NULLとの比較を行う関数として、strcmp関数を使用したいと考えています。
  • 文字列変数に「あいうえお」が入っている場合、何もない場合、真の処理と偽の処理を通るか分かりません。
  • NULLは「0」と定義されている場合がありますが、文字列変数が何もない場合に偽の処理をするプログラムの作り方を教えてください。
回答を見る
  • ベストアンサー

NULLの定義について

C言語で、NULLとの比較を行う関数として、 strcmp関数を使用したいと考えています。 ある、文字列変数に、 "あいうえお"が入っている場合、 ""(何もない)の場合、 下記の例で真の処理と偽の処理、 どちらを通るのでしょうか。 当然、文字列変数が"あいうえお"の場合は、 真の処理を通ると思いますが、 ""(何もない)の場合が分かりません。 例として、 ~中略~ if( strcmp( 文字列変数, NULL ) != 0 ){ 真の処理 }else{ 偽の処理 } ~中略~ の時です。 言語によって、NULLは「0」と定義されていたような 記憶もありますが・・ したい事は、文字列変数が""の場合、 偽の処理をするようにしたいです。 プログラムの作り方を教えて下さい。

  • burbe
  • お礼率35% (78/221)

質問者が選んだベストアンサー

  • ベストアンサー
  • fruipa
  • ベストアンサー率38% (14/36)
回答No.6

#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)

noname#130082
noname#130082
回答No.10

補足2: NULLや0をポインタと見なした場合は、空ポインタとか無効ポインタとか言いますが「0番地」となる保障はありませんので、ご注意ください(Windowsなどでは、多分0番地になると思いますが)。保障されているのは、他のデータや関数の参照に絶対にならない値、であることぐらいです。

noname#130082
noname#130082
回答No.9

補足:これがうまくいくのは、文字列がASCIIなどの場合の話です。ワイド文字などの場合は私も勉強しないと分かりません。

noname#130082
noname#130082
回答No.8

空ポインタ(マクロ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.7

No.6 です。 コピペミスしました。正しくは プログラムコードとしては if( strcmp( 文字列変数, "" ) != 0 ) か if(文字列変数[0]!=0) で良いと思います。 です。↓

noname#198419
noname#198419
回答No.5

C言語のNULLは「(int)0」とかNULキャラクタとかではなくNULLポインタです。 混同して勘違いをしないようにね。

回答No.4

C++は知らないので、昔ながらのC言語についての解答です。 例として記載されているコーディングの NULL の使い方が間違っています。   誤: strcmp( 文字列変数, NULL )   正: strcmp( 文字列変数, "" ) "誤"のコーディングでは、0番地という値がパラメータとして渡されます。strcmp関数は0番地にある文字列と比較することになりますが、たいていそこは(あなたがコーディングしているこのプログラムにとっては)でたらめな文字列になっています。 "正"のコーディングは、ヌル文字列のアドレスがパラメータとして渡され、意図どおりの結果を返してくれます。 ただし、もしかしたらコンパイラによっては、"誤"のコーディングでも"正"と同じ解釈をするようにstrcmp関数が作られているものがあるかも知れません(つまり方言です)。しかし仮にそうであっても、"正"のコーディングのように、本来の意味どおりのコーディングを心がけるべきです。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

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

noname#39970
noname#39970
回答No.2

Shift-JISの場合。 "あいうえお" → 82 A0 82 A2 82 A4 82 A6 82 A8 00 ""(NULL) → 00 の比較。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

NULLポインタと空文字列は違います。 空文字列は  char str[] = {'\0'}; なので(右辺は""でも良い)、 空文字列へのポインタは'\0'が格納されているどこか有効な領域を指します。 > strcmp( 文字列変数, NULL ) は、NULLが有効な領域を指していないため誤りです。 空文字列と比較するなら  strcmp( 文字列変数, "" ) とします。

関連するQ&A

  • 変数の内容がNullと認識して、条件分岐するには?

    例えば、flagという変数があります。 この変数の内容がNull(空白)であるかどうかの区別はどうすればいいでしょうか? イミディエイトの窓で以下を実行してみたら、 ? flag Null if flag = Null then ? "真" else ? "偽" 偽 となります。flagはNullなのに、何故"偽"なんでしょう?どうすれば、真と判断してくれるのでしょうか? よろしくお願いします。

  • 【C言語】文字列による処理の分岐について

    いつも丁寧な解説拝見しております。 C言語について質問させて頂きます。 シリアル通信によって受信した1バイトの文字列があるとします。 この文字列のパターンよって処理の分岐をさせたい場合、コードはどのように書けば良いのでしょうか。 より具体的に申しますと、 →文字列パターン1の場合、関数1を呼び出す。 →文字列パターン2の場合、関数2を呼び出す。 →文字列パターン3の場合、関数3を呼び出す。・・・・・・ と、100パターンほどの文字列があり、それぞれにおいて異なる関数を呼び出したいと考えております。私の理解は以下に示す通りなのですが、どうも正しい処理が分らないでいます。 ・受信した文字列がどのパターンなのかを判断するために、strcmp関数で比較を行う。 ・多分岐なので、switch case文かelse if文を用いる。 この場合、条件式の中でstrcmp関数による比較を行えば良いのでしょうか。簡単にコードを示して頂ければ幸いです。C言語初心者なので理解に間違いがあるかもしれませんが、どうぞよろしくお願い致します。

  • 文字列がNULLか空文字列かの判定

    Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0) 文字列の扱いについて、質問します。 関数 int func(char *str) があると仮定します。 パラメータとして、strは以下のような状態あるとします。 (strは関数が呼ばれる前にcalloc()で領域確保済み)  シンボル名 値  str      0x00000001 "" 上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。 どうしたらよいのでしょうか。アドバイスをお願いします。

  • while文の条件

    参考書でC言語を勉強しておりますが、タイトルの件で分からないことがあります。 #include <stdio.h> #include <string.h> void main(void) { char *p = "stop"; char str[80]; do { printf("文字列を入力してください:"); gets(str); }while(strcmp(p , str)); } while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。

  • while文の条件

    参考書でC言語を勉強しておりますが、タイトルの件で分からないことがあります。 #include <stdio.h> #include <string.h> void main(void) { char *p = "stop"; char str[80]; do { printf("文字列を入力してください:"); gets(str); }while(strcmp(p , str)); } while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。

  • 空っぽだけど真にして条件を実行したい

    ActionScriptというFlashの言語についてなのですが、 プログラミングの基本だと思いますので、 アドバイスお願いします。 if(v_title == ""){ gotoAndPlay("title");     }else{ v_titleが空っぽじゃない場合の処理 } という上記の単純なスクリプトなのですが、 上記の条件式では、==の右側が""となっているので、 偽と判断されて、gotoAndPlay("title"); という式が実行されません。 ですが、私は、v_titleの中身が空っぽの場合に、 真となって、gotoAndPlay("title") をどうしても実行させたいと思っています。 中身がない変数を「真」と判断させるための条件式の書き方を教えてください。 ActionScriptでは文字列比較も、数値比較も==で済ませられるようです。

  • Excel関数の戻り値でnullを返したい

    教えてください。 Excel関数で、戻り値として null を返す方法はないでしょうか? 0文字の文字列である””を返すのではなく、 nullを返したいです。 よろしくお願いします。

  • 【Excel2003VBA】セルの文字で条件分岐

    基本的な質問で恐縮ですが、Excel2003のVBAで条件分岐をするときの方法について質問です。 例えば、A1に文字列の「当選」と「あたり」があった場合は、真の処理を、それ以外の場合は偽の処理をする場合は条件式にどのように書けば良いのでしょうか? 次の【条件式】に入る書き方を教えてください。 sub 条件分岐()   If 【 条件式 】 Then     真の場合   Else     偽の場合 End sub

  • 「検査?真の処理:偽の処理」の書き方

    PHP4で、JpGraphに配列データを流しこもうとしているのですが ■例1 $datax[] = ( is_null ($data1) ? 0 : $data1); とか ■例2 $datax[] = ( (is_null ($data1)) ? 0 : $data1); とか ■例3 $datax[] = ( is_null ($data1) ? $datax[] = 0 : $datax[] = $data1); などだとだめで、 ■例3 if (is_null($data1)) {  $datay[] = 0; } else {  $datay[] = $data1; } だとOKなのですが、何か文法ミスがあるでしょうか? 「検査?真の処理:偽の処理」の書き方が1行ですっきりしていてすきなのですが。

    • ベストアンサー
    • PHP
  • エクセルでのNULLという文字列挿入について

    エクセルで空白のセルに対してNULLという文字列を挿入したいのですが、 SUBSTITUTE関数を使ってやろうとたらNULLは0と判断されて0が入力されてしまいます。 NULLという意味ではなくて、NULLという文字列そのものを入力するときはどのようにしたらよいのでしょうか?

専門家に質問してみよう