2016-03-21 161 views
2

我的任務是使用while循環編寫簡單的代碼來測試值並將相應的響應返回給值,在本例中使用switch語句的字母等級。使用scanf輸入切換

我的問題是測試一個不包含整數的值。我相信我可以在switch語句之前通過IF測試來解決問題。我正在尋找關於此語句措辭的幫助。

我知道我錯過了循環後我認爲是賦值IF的推薦。我也會接受關於如何檢查錯誤以及寫入錯誤和寫入異常代碼的建議。

此外,如果有人可以如此善良,你會向我解釋scanf如何在輸入中分配一個值。我相信我的問題在於scanf如何分配值。我不認爲我的代碼通過switch與臨時值相比解析了真值。

#include <stdio.h> 
#include <stdlib.h> 

int main(void) {  
    int grades; 

    printf("Enter a value for grading in numeric form\n"); 

    while ((scanf("%i", &grades)) != EOF) { 
     switch (grades) { 
      case 10: 
      case 9: 
      printf("A grade of %i is an A\n", grades); 
      break; 
      case 8: 
      printf("A grade of %i is an B\n", grades); 
      break; 
      case 7: 
      printf("A grade of %i is an C\n", grades); 
      break; 
      case 6: 
      printf("A grade of %i is an D\n", grades); 
      break; 
      case 5: 
      case 4: 
      case 3: 
      case 2: 
      case 1: 
      case 0: 
      printf("A grade of %i is an F\n", grades); 
      break;                         
      default: 
      printf("This is not a valid entry\n");  
     } 
    } 
    return 0; 
} 

如果試圖如A.

+0

同時檢查'scanf'是否確實寫過'grades'。 – Olaf

+0

Olaf我相信這就是我所缺少的,我該怎麼做? –

+0

閱讀'scanf'手冊怎麼樣? – Olaf

回答

2

您應該測試scanf回報1,而不是隻檢查文件的末尾傳遞一個角色,我得到一個無限循環的錯誤。如果輸入非數字輸入,則scanf失敗並返回0,但將有問題的輸入留在stdin中,則循環體執行的潛在無效值爲grades,並且下一次迭代再次失敗......無限期地。

更改代碼:

while (scanf("%i", &grades) == 1) { 
    ... 
} 

如果你希望你的循環在輸入無效的情況下重新啓動,該代碼改成這樣:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    char buf[80]; 
    int grades; 

    for (;;) { 
     printf("Enter a value for grading in numeric form\n"); 
     if (fgets(buf, sizeof buf, stdin) == NULL) 
      break; 

     if (sscanf(buf, "%i", &grades) != 1) { 
      printf("not a number: %s", buf); 
      continue; 
     } 
     switch (grades) { 
      case 10: 
      case 9: 
      printf("A grade of %i is an A\n", grades); 
      break; 
      case 8: 
      printf("A grade of %i is an B\n", grades); 
      break; 
      case 7: 
      printf("A grade of %i is an C\n", grades); 
      break; 
      case 6: 
      printf("A grade of %i is an D\n", grades); 
      break; 
      case 5: 
      case 4: 
      case 3: 
      case 2: 
      case 1: 
      case 0: 
      printf("A grade of %i is an F\n", grades); 
      break;                         
      default: 
      printf("This is not a valid grade: %d\n", grades); 
      break; 
     } 
    } 
    return 0; 
} 
+0

int 1是一個我將要測試的值。這是交換機中的一種情況。我需要對非數字字符進行測試,以便我可以一次測試多個項目。 –

+0

@AndrewBodin:'scanf'返回成功轉換次數。如果用戶輸入非數字等級,你想要做什麼? – chqrlie

+0

我想獲得switch語句返回默認值。目前它運行一個連續的循環。我很樂意就如何着手這方面提出建議。我無法測試ANSI特定字符超出範圍,因爲這會工作,但依賴於系統。 –

1

這適用於作爲一個可選的解決方案,它似乎與上面的代碼一樣。

int main(void) { 
int grades; 
int temp; 

while((temp = scanf("%i", &grades)) != EOF) 
{ 
    if(temp == 0) 
    { 
     printf("Invalid charactur\ne"); 
     while(getchar() != '\n') 
      ; 
    } 
    else 
     switch (grades) {