- ベストアンサー
特定の文字が入力されるまで・・・
プログラムで、 A~Cの記号が選ばれるまで、 (つまり他の文字が入力されたらもう一度入力しなすようにしたい) 入力コマンドを繰り返す制御文を作りたいのですが 自分で作ってもうまくいきません。 char c; while((c=getchar())!='A'||'B'||'C'){ } 以下はA,B,Cのいずれかが入力されたら実行される制御文が続く しかし、実際はA~Cを入力しても、 次の制御文に移りません。 どこがおかしいでしょうか? また、正しく動かすにはどうすればよいでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
試してないけどこのコードは無限ループでしょうね。 人間の考え方と、コンピュータの考え方の違いがまさに現れてるコードに見える。 このコードは簡単に言うと、while(判定文1or判定文2or判定文3)てことです(それはわかりますか?)。 で、判定文1は今仮に置いとくとしても、判定文2と判定文3は絶対にTrueになってしまうんですよ。 それはわかりますか? 判定文というのは、要は0ならFalse、0以外ならTrueですから、判定文2に'B'という0以外の値('B'は0x42)を書いた時点で必ずTrueになってしまいます。 だから、たとえ判定文1がFalseであっても判定文2は絶対Trueになるから、判定文3は評価されることすらなく、while()の中全体の評価は必ずTrueとなってしまい、無限ループになります(次の制御文に行きません)。
その他の回答 (4)
- aris-wiz
- ベストアンサー率38% (96/252)
無限ループになる理由はNo4さんが回答しているので、 蛇足ですが、一度は必ず入力するならば、 int c; do{ c = getchar(); }while( c!='A' && c!='B' && c!='C' ); でいいかと。 親切なのはNo1さんのが親切かな。 ちなみに細かいですが、getcharは入力ストリームから文字を、 unsigned char型の値として読み取り、int型に変換して返してきます。
お礼
ご回答ありがとうございます。 間違えていた箇所がわかりました。 ありがとうございました。
- koko_u_
- ベストアンサー率18% (459/2509)
対称性が崩れてるからヤダ。
お礼
意味がわかないのですが
- yaemon_2006
- ベストアンサー率22% (50/220)
ちょっとすっきり。 while ( (c = getchar()) != 'A' && c != 'B' && c != 'C' ) { fprintf(stderr, "re-enter a character\n"); }
お礼
ご回答ありがとうございます。 そうですね^^
- koko_u_
- ベストアンサー率18% (459/2509)
>どこがおかしいでしょうか? 明らかに (c=getchar())!='A'||'B'||'C' ですね。 char c = getchar(); while ( c != 'A' && c != 'B' && c != 'C' ) { fprintf(stderr, "re-enter a character\n"); c = getchar(); } という風か?
お礼
ご回答ありがとうございます。 間違っていた箇所がわかりました。
お礼
ご回答ありがとうございます。 while((c=getchar())!='A'||'B'||'C') ここが変だと気づきました。 へぼミスです。 親切な回答ありがとうございました。