2012-04-09 22 views
0

我正在通過Stephen Kochan在'C編程'中學習C語言。我正在研究第6章的練習4,編寫一個充當簡單累加器計算器的代碼。代碼如下。只要輸入按照正確的順序提供,它就可以正常工作。如何阻止這些代碼掛在錯誤的輸入處?

#include<stdio.h> 

    int main(void) 
    { 
     float num, accum = 0; 

     char operator; 


     while(1) 

     { 

      printf("Enter the number and the operator "); 
      scanf("%f %c",&num, &operator); 

      if (operator == 'E') break; 

      switch (operator){ 

     case 'S': 
      accum = num; 
      printf("= %g\n",accum); 
      break; 

     case '+': 
      accum = accum + num; 
      printf("= %g\n",accum); 
      break; 

     case '-': 
      accum = accum - num; 
      printf("= %g\n",accum); 
      break; 

     case '*': 
      accum = accum * num; 
      printf("= %g\n",accum); 
      break; 

     case '/': 
      accum = accum/num; 
      printf("= %g\n",accum); 
      break; 
      }  
     } 

     printf("= %g\n",accum); 
     printf("End of Calculation\n"); 

     return 0; 

    } 

但它掛在錯誤的輸入。可以做些什麼來檢查這種行爲?

+1

'operator'是一個C++關鍵字。這可能不是在C. – ouah 2012-04-09 10:20:01

回答

6

簡短版本是「不要使用scanf()」。

問題是scanf()只提供了一個有限的錯誤指示,並且在下一次調用時將未讀出的錯誤數據留下;特別是如果你不打算進行錯誤檢查,它會永遠在不良數據上旋轉。

  1. 總是檢查返回碼,所以你知道它是否有效。
  2. 如果您正在進行面向行的輸入,請使用fgets()或類似的語句讀取整行,並使用sscanf()從行中解析。
  3. 理智做事如果輸入的是不是你所期望的,而不是僅僅通過橫衝直撞上。 (您現有的代碼只是假設它始終有效。)
2

不使用scanf。這是該計劃的第一眼看到的建議。使用類似getchar之類的東西,如圖所示here他們正在處理與您相同的問題。

+0

中的變量名稱的最佳選擇,那麼我將如何從用戶採取輸入? – KawaiKx 2012-04-09 10:21:52

+0

我還在編輯我的答案:) – 2012-04-09 10:22:24

+0

aha ..它的scanf函數並不像我所期望的那麼簡單..我還沒有學習其他用於用戶輸入的函數.. – KawaiKx 2012-04-09 10:29:50

2
  1. 檢查scanf()回報2,表明它已填充兩個參數
  2. 提供該報告錯誤switch語句的默認情況。

爲了提高耐用性,你可能需要閱讀使用fgets()(不使用gets(),因爲它很容易受到緩衝區溢出),並分析利用sscanf()結果整條生產線。如果您想要從錯誤輸入提供恢復,這只是必要的。否則,只要堅持使用scanf()exit(1)(以及錯誤消息),如果出現任何問題。

相關問題