2012-08-04 72 views
2

我在我的代碼下面遇到問題。當我輸入任何整數,即(0-9),那麼它是確定的。但是,當我輸入其他字符如AB或任何其他字母scanf()失敗。然後它不會等待任何進一步的輸入。爲什麼scanf在一次失敗後不等待用戶輸入?

我附上了一個代碼片段。我非常需要僅使用C標準庫的錯誤處理。

#include <stdio.h> 

int main() 
{ 
    int choice; 
    while(1) 
    { 
     printf("Enter your choice: "); 
     if(0 == scanf("%d", &choice)) 
      { 
       printf("Some error occured\n"); 
       //break;/*I did not want to break this loop as I use this to show menu*/ 
      } 

     switch(choice) 
     { 
         case 0:printf("Case 0\n");break; 
         case 1:printf("Case 1\n");break; 
         case 2:printf("Case 2\n");break; 
         case 3:printf("Case 3\n");break; 
         case 4:printf("Case 4\n");break; 
         case 5:printf("Case 5\n");break; 
         case 6:printf("Case 6\n");break; 
         case 7:printf("Case 7\n");break; 
         case 8:printf("Case 8\n");break; 
         case 9:printf("Case 9\n");break; 
         default:printf("Default case\n");break; 

     } 
    } 
} 

更清楚的問題是:爲什麼在失敗後等待?

回答

3

使用scanf,如果給定的輸入與格式規範不匹配,則輸入不會被消耗並保留在輸入緩衝區中。換句話說,不匹配的字符永遠不會被讀取。

因此,當你輸入時,例如一個a字符,您的代碼將無限循環,因爲scanf繼續在同一個字符上失敗。

scanf返回一個錯誤,你需要擺脫違規字符(s)。

你無法知道有多少字符將被輸入,但一個簡單的方法來消耗任何違規的字符是嘗試讀取字符串時scanf函數失敗:

char junkChars[256]; 

printf("Enter your choice: "); 
if (scanf("%d", &choice) == 0) 
{ 
    printf("Some error occured\n"); 
    scanf("%s", junkChars); 
} 

這將清除輸入緩衝區,但依賴於上限。如果用戶鍵入比256個字符,則scanf將在下一次迭代中繼續使用它們。

很明顯,這是一個醜陋的解決方案,但由於這個原因,scanf並不是一個很好的輸入機制。最好使用fgets將輸入行作爲字符串,然後自己控制該字符串的解析。

+0

這工作正常,但是C庫提供了一些設施來清除輸入緩衝區。就像它們爲輸出緩衝區提供像fflush()一樣的工具。 – rajesh6115 2012-08-04 02:44:13

+0

不,沒有標準的工具來清除輸入緩衝區(儘管有些實現可能提供它)。只要閱讀輸入,例如使用fgets()。這只是一個像fflush()一樣的函數調用。 – nos 2012-08-04 02:48:02

+0

謝謝你的回答... – rajesh6115 2012-08-04 02:53:22

0

這是設計。

請勿使用中斷,請使用繼續

+0

我想知道爲什麼不等待我的輸入進一步,我如何管理錯誤,以便我可以再次輸入。 – rajesh6115 2012-08-04 02:29:00

+0

它爲什麼要等待?當你按Enter鍵時,你正在讀取字符串。如果出現錯誤,您需要決定是否要重試或中止程序。 – 2012-08-04 02:33:43