• ベストアンサー

特定の文字が入力されるまで・・・

プログラムで、 A~Cの記号が選ばれるまで、 (つまり他の文字が入力されたらもう一度入力しなすようにしたい) 入力コマンドを繰り返す制御文を作りたいのですが 自分で作ってもうまくいきません。 char c; while((c=getchar())!='A'||'B'||'C'){ } 以下はA,B,Cのいずれかが入力されたら実行される制御文が続く しかし、実際はA~Cを入力しても、 次の制御文に移りません。 どこがおかしいでしょうか? また、正しく動かすにはどうすればよいでしょうか?

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

  • ベストアンサー
  • crew21
  • ベストアンサー率26% (58/222)
回答No.4

試してないけどこのコードは無限ループでしょうね。 人間の考え方と、コンピュータの考え方の違いがまさに現れてるコードに見える。 このコードは簡単に言うと、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となってしまい、無限ループになります(次の制御文に行きません)。

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 while((c=getchar())!='A'||'B'||'C') ここが変だと気づきました。 へぼミスです。 親切な回答ありがとうございました。

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

無限ループになる理由はNo4さんが回答しているので、 蛇足ですが、一度は必ず入力するならば、 int c; do{  c = getchar(); }while( c!='A' && c!='B' && c!='C' ); でいいかと。 親切なのはNo1さんのが親切かな。 ちなみに細かいですが、getcharは入力ストリームから文字を、 unsigned char型の値として読み取り、int型に変換して返してきます。

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 間違えていた箇所がわかりました。 ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

対称性が崩れてるからヤダ。

tkb_ht5
質問者

お礼

意味がわかないのですが

回答No.2

 ちょっとすっきり。 while ( (c = getchar()) != 'A' && c != 'B' && c != 'C' ) {   fprintf(stderr, "re-enter a character\n"); }

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 そうですね^^

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>どこがおかしいでしょうか? 明らかに (c=getchar())!='A'||'B'||'C' ですね。 char c = getchar(); while ( c != 'A' && c != 'B' && c != 'C' ) {   fprintf(stderr, "re-enter a character\n");   c = getchar(); } という風か?

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 間違っていた箇所がわかりました。

関連するQ&A