2016-11-20 107 views
1

用戶只有兩個選擇'a'或'b',如果用戶輸入不是'a'或'b',則錯誤消息應該提示他們只輸入'a'或' b」。輸入驗證:檢查多個值

好: 我輸入字母'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

因爲你叫'getchar'兩次你讀兩個字符。你最終也會抓住換行符'\ n'。所以當你輸入a時,'c = getchar()!='a''的計算結果爲false,並跳過循環(我認爲由於短路跳過了第二個條件)。但是當你輸入b時,''b'!='a''和''\ n'!='b'',所以它進入while循環。另外,我敢肯定這是作爲'c =(getchar()!='a')'執行的,這大概不是你所期望的。 –

+0

謝謝米莉! –

回答

1

無論何時你做getchar()都會讀取_different_字符。所以,你應該改變while環路

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

否則只要條件c = getchar() != 'b'檢查,C會\n

更重要的是,您應該將\n排除在外。因此,您可以在while循環中添加另一個getchar(),該循環的返回值不需要使用。

+0

謝謝elikatsis! –

1

多個問題:

  • c = getchar() != 'a'沒有存儲字符讀入c,它讀取和丟棄的字符,並存儲成對比的c的結果。

  • 您應該測試字符讀取的值而不是讀取第二個字符。

  • 還應如果文件檢查結束,並使用int允許的unsigned char所有值和特殊值EOF

  • 復卷stdin閱讀更多字節不會產生你所期望的:要麼成功,你會重新讀取相同的字節數,或者它可能會失敗,是stdin是無緩衝,並綁定到設備。

試試這個:

#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; 
}