2012-08-10 54 views
0

我有一個非常簡單的代碼段,其中有一個做,而具有開關的情況下環路去如下:如果事故無限循環的錯誤輸入

do { 
    printf("Enter Choice\n"); 
    scanf("%d", &choice); 
    switch(choice) { 
      case 1: printf("1 selected"); 
        break; 
      case 2: printf("exit"); 
        break; 
      default: printf("wrong input"); 
        break; 
    } 
} while (choice != 2); 

在這一段代碼我輸入一個字符而不是一個數字,該程序無限循環,並且甚至不接受輸入。 我知道這是可以糾正,如果我進入開關罩前插入

if(isdigit(choice)) 

。但我的問題是爲什麼它首先發生。

它不應該轉到默認情況並再次要求輸入嗎?

+1

我不明白'if(isdigit(choice))'是否可以解決這個問題,因爲'choice'是已經解釋過的整數輸入,而不是'char'。 – 2012-08-10 10:24:11

+0

當你輸入的內容與格式規範不同時,你會遇到問題,換句話說不是,爲了得到這種情況,它必須是正確的格式。我會說接受一切作爲一個字符串。這樣就不會出現任何錯誤。然後,對輸入字符串進行檢查,根據需要進行轉換......等等...... – ChiefTwoPencils 2012-08-10 10:28:18

回答

5

如果scanf無法將輸入與格式說明符相匹配,則會將其保留在緩衝區中。所以下一次它仍然不會匹配等等。換句話說,它不會吃它無法比擬的。您必須檢查scanf(匹配項目的數量)返回的值,以確保輸入是預期的。

另外,跳過不必要的東西,你可以嘗試(未經測試):

scanf("%*[^0-9]%d", &choice); 

這應該放棄任何東西,這不是試圖讀取一個十進制整數前一個數字。

1

請查看scanf說明書頁面。

如果在這種情況下輸入中的下一個東西不是數字,它不會消耗它。

您需要檢查scanf的返回值,如果它爲零,則消耗下一個字符並再次嘗試(或者直到到達行尾)。