ifの条件式が反映されません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
blade

ifの条件式が反映されません

#1

投稿記事 by blade » 13年前

以下のソースを書いた時,①つ目の条件だと条件失敗でprintfされない(これは要望通り)のですが,
②つ目のとき,strcmp(word[1], "no")!=0が反映されずprintfされてしまいます.
これは何が誤っているのでしょうか.

コード:

char word[300][60]={'\0'};

strcpy(word[1], "no");
/*条件①*/
if(strcmp(word[1], "no")!=0)printf("noではありません:%s", word[i]);

/*条件②*/
if(strcmp(word[1], "no")!=0||word[2]!=NULL)printf("noでもないしwordない:%s", word[i]);

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ifの条件式が反映されません

#2

投稿記事 by みけCAT » 13年前

word[2]がNULLである可能性は非常に低いと思います。

コード:

#include <stdio.h>
int main(void) {
    char word[300][60]={'\0'};
    printf("%p\n",word[2]);
    return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

blade

Re: ifの条件式が反映されません

#3

投稿記事 by blade » 13年前

みけCAT さんが書きました:word[2]がNULLである可能性は非常に低いと思います。

コード:

#include <stdio.h>
int main(void) {
    char word[300][60]={'\0'};
    printf("%p\n",word[2]);
    return 0;
}
可能性が非常に”低い”とはどういうことでしょうか.
絶対に違うわけではないのですか.

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ifの条件式が反映されません

#4

投稿記事 by みけCAT » 13年前

普通の処理系では、word[2]がNULLになることは無いと考えられます。
しかし、word[2]がNULLになる処理系が無いと断言することは私にはできませんでした。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ifの条件式が反映されません

#5

投稿記事 by softya(ソフト屋) » 13年前

みけCATさんが書いたのは
char word[300][60]={'\0'};
だとword[2]は確かにポインタ値が得られますが、
char *word[300];
と定義した場合と違いword[2]がNULLなる可能性はほぼ無いといって良いという話です。

ナル文字と混同しているのなら、長さ0の文字列と言うことで
word[2][0]!='\0'
と同じ事を書いたつもりなのかしれませんが、ここはstrlen()を使うべきでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

Re: ifの条件式が反映されません

#6

投稿記事 by box » 13年前

blade さんが書きました:

コード:

/*条件②*/
if(strcmp(word[1], "no")!=0||word[2]!=NULL)printf("noでもないしwordない:%s", word[i]);
NULLと'\0'とを混同しているように見えるのはさておき…

コードの条件文は || でor条件のように見えるのに、
printf()の中身が「~でもないし~でもない」と、いかにもand条件のことを
書いているように見えるのは大丈夫なんでしょうか。

また、条件1、2について、printf()の中のwordの添字iの値はちゃんとセットできているでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: ifの条件式が反映されません

#7

投稿記事 by beatle » 13年前

blade さんが書きました:①つ目の条件だと条件失敗でprintfされない(これは要望通り)
つまり、「strcmp(word[1], "no")!=0」は偽です。

プログラミングに限らず論理の世界で A || B は A が偽ならば
A || B ⇔ B
となります。

ちなみにですが、A && B は A が偽ならば
A && B ⇔ 偽
となります。

したがって、
strcmp(word[1], "no")!=0||word[2]!=NULL
⇔偽||word[2]!=NULL
⇔word[2]!=NULL
となって、仰るとおりの結果となります。
blade さんが書きました:これは何が誤っているのでしょうか.
何も誤っておりません!

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

Re: ifの条件式が反映されません

#8

投稿記事 by dic » 13年前

条件式の使い方というより、boxさんのおっしゃるとおり、条件2は、想定した条件でしょうか?

説明すると、
word[1] は "no" がはいってていいんですね
なので、条件1は真で、printfされない
これは想定どおりですね。

次、条件2は、word[1]=="no" と word[2] != NULL ですね
まず、条件1から導きだされた word[1]=="no" で片方は真
もう片方は、ここのコードにはないので、初期化されていないと想定して word[2] にはゴミがはいっています
なので、word[2] != NULL になって、こちらも真 これをA
仮に初期化されていてて、word[2] == NULL(\0) で偽 これをB
とすると
Aの場合
 真 || 真で 真となり、条件式が実行されます
Bの場合
 真 || 偽 で、こちらも真になり条件式が実行されます

条件2でprintfされない条件は
 偽 || 偽 となる場合のみです。

 偽 || 真 も真となり、条件式が実行されます。


・・・ですよね?(汗)

閉鎖

“C言語何でも質問掲示板” へ戻る