2016-11-20 4 views
1

ユーザは 'a'または 'b'の2つしか選択肢がありません。ユーザの入力が 'a'または 'b'でなければエラーメッセージは 'a' b '。入力の検証:複数の値をチェック

THE GOOD: 私は文字 'a'を入力し、whileループをバイパスします。

ザ・バッド: 「b」と入力するとwhileループをバイパスしません。

これを修正するための提案はありますか?

#include <stdio.h> 
int main(void) 
{ 
    char c; 

    printf("enter a or b to make it out!\n"); 

    //loop if answer is NOT a or b 
    while ((c = getchar() != 'a') && (c = getchar() != 'b')) 
    { 
     //let the user know there has been a problem! 
     printf("That value is invalid"); 
     printf("\nPlease enter a or b:\n"); 
     fseek(stdin,0,SEEK_END); 
    } 

    printf("You made it out!"); 
    return 0; 
} 
+0

あなたは2つの文字を読んで。あなたは改行文字 '\ n'をつかむことになります。したがって、aをタイプすると、 'c = getchar()!= 'a''はfalseに評価され、ループをスキップします(短絡のために第2の条件もスキップします)。しかし、b、 '' b '!=' a''、 ''\ n'!= 'b''と入力するとwhileループに入ります。また、これは 'c =(getchar()!= 'a')'として実行されていると確信しています。おそらくあなたが期待しているものではありません。 –

+0

ありがとうミリー! –

答えて

1

getchar()を実行するたびに_different_文字が読み込まれます。だから、条件c = getchar() != 'b'がチェックされるたびにそれ以外の場合、cは\nなります

while (((c = getchar()) != 'a') && (c != 'b')) 

としてwhileループを変更する必要があります。

さらに、\nを取得する必要があります。したがって、戻り値を使用する必要のないループwhileに別のgetchar()を追加することができます。

+0

ありがとうございました! –

1

複数の問題:

  • c = getchar() != 'a'

    が文字を格納していませんが、それは読み込み、文字を破棄し、cに比較した結果を格納し、cに読み込みます。

  • 2番目の文字を読み取る代わりに、読み取った文字の値をテストする必要があります。

  • また、ファイルならば最後のチェック、およびunsigned charのすべての値および特別な値EOF可能にするためにintを使用する必要があります。あなたが期待するものを生成しませんさらにバイトを読み取るためにstdinを巻き戻し

  • :どちらか、それが成功したとあなたは同じバイトを再読み込みしますか、それはあるstdinはバッファなしおよびデバイスに接続されていないことがあります。

これを試してください:あなたは二回getchar` `呼び出すため

#include <stdio.h> 

int main(void) { 
    int c; 

    printf("enter a or b to make it out!\n"); 

    //loop if answer is NOT a or b 
    while ((c = getchar()) != EOF && c != 'a' && c != 'b') { 
     //let the user know there has been a problem! 
     printf("That value is invalid"); 
     printf("\nPlease enter a or b:\n"); 
    } 
    printf("You made it out!\n"); 
    return 0; 
} 
関連する問題