プロが教える店舗&オフィスのセキュリティ対策術

プログラムで、
A~Cの記号が選ばれるまで、
(つまり他の文字が入力されたらもう一度入力しなすようにしたい)
入力コマンドを繰り返す制御文を作りたいのですが
自分で作ってもうまくいきません。

char c;
while((c=getchar())!='A'||'B'||'C'){
}
以下はA,B,Cのいずれかが入力されたら実行される制御文が続く


しかし、実際はA~Cを入力しても、
次の制御文に移りません。
どこがおかしいでしょうか?
また、正しく動かすにはどうすればよいでしょうか?

A 回答 (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となってしまい、無限ループになります(次の制御文に行きません)。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/18 12:22

無限ループになる理由はNo4さんが回答しているので、


蛇足ですが、一度は必ず入力するならば、
int c;
do{
 c = getchar();
}while( c!='A' && c!='B' && c!='C' );
でいいかと。

親切なのはNo1さんのが親切かな。

ちなみに細かいですが、getcharは入力ストリームから文字を、
unsigned char型の値として読み取り、int型に変換して返してきます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/18 12:10

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

    • good
    • 0
この回答へのお礼

意味がわかないのですが

お礼日時:2007/12/18 12:22

 ちょっとすっきり。


while ( (c = getchar()) != 'A' && c != 'B' && c != 'C' ) {
  fprintf(stderr, "re-enter a character\n");
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/18 12:23

>どこがおかしいでしょうか?


明らかに

(c=getchar())!='A'||'B'||'C'

ですね。

char c = getchar();
while ( c != 'A' && c != 'B' && c != 'C' ) {
  fprintf(stderr, "re-enter a character\n");
  c = getchar();
}

という風か?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/18 12:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!