- ベストアンサー
if文の分岐をelseにする事ができません。
以下のような定義の構造体があります。 この構造体のメンバであるchar型配列Cが、 【実行】にあるようにif文で使われている時にelseの処理2を実行する事ができませんでした。 char型の変数だと、'\0'が入っていればelseとなるのですが、 配列となっているCにstrcpyで'\0'や0,NULLを設定してみてもelseにはなりませんでした。 この様なif文でelseの処理2を実行するにはどうすれば良いのでしょうか? 初歩的な質問かも知れませんが、回答頂けると幸いです。 【定義】 typedef struct { struct { char C[100]; }B }A 【実行】 static A* hoge; hoge = (A*)malloc(sizeof(A)); if(A->B.C) { 処理1 }else{ 処理2 }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ポインタ/配列と数値の違いを理解するようにしましょう。 char C[100]とあるように、Cはcharの配列です。 > A->B.C と、Cだけ書いた場合は、配列の先頭アドレスになります。 A->B.C == &(A->B.C[0]) 配列として領域がちゃんと確保されているので、アドレスはNULLにはなっていません。 NULLでないので、真となり、当然ifの方が実行されます。 Cを文字列として利用していて、空文字列(長さ0の文字列)かどうかの判定したいのだったら、例えば次のような方法を使います。 if ( A->B.C[0] != '\0' ) /* 先頭が\0 → 長さが0 */ if ( A->B.C[0] != 0 ) /* 別表記 */ if ( A->B.C[0] ) /* 0でない→真 ということを利用 */ if ( strcmp(A->B.C,"") != 0 ) /* 「空文字列では無い」という意味を明記 */ > Cにstrcpyで'\0'や0,NULLを設定 これ、具体的にどうやったんですか? strcpy(A->B.C, '\0'); strcpy(A->B.C, 0); strcpy(A->B.C, NULL); だとしたら、「Cに空文字列を設定」の意味にはなりません。
その他の回答 (1)
- D-Matsu
- ベストアンサー率45% (1080/2394)
A->B.C ってのは「構造体Aの持つ構造体Bの持つchar配列Cの先頭アドレス」ですから常に0ではありません。 そんだけの事です。
お礼
まさしく、そのとおりでした。 初歩的な質問にご回答ありがとうございました。
お礼
A->B.CがNULLということは、配列として領域が確保されていないことなるので、 if(A->B.C)では空文字列の判定ができないのですね。 ご丁寧な説明ありがとうございました。 > Cにstrcpyで'\0'や0,NULLを設定 これ、具体的にどうやったんですか? おっしゃられる様に設定していました・・・。 アドレスに'\0'を指定しても空にはならないですね。。。 精進します。