2017-08-12 114 views
0

我做了一個需要完成當進入EOF字符(按Ctrl-Z適用於Windows)和應打印一個簡單的C程序:結束在C程序文件(EOF)的

  • 通過的情況等級高於或等於5.
  • 如果等級高於或等於8,則通過高通。
  • 對於任何其他情況都失敗。

我使用getchar()作爲用戶輸入(在這種情況下的等級)。

#include <stdio.h> 

int main() { 
    int grade; 
    puts("Enter a grade\n"); 
    puts("Enter the EOF character to end input\n"); 

    while ((grade = getchar()) != EOF) { 
     if (grade >= 5) { 
      puts("Passed"); 
      if (grade >= 8) { 
       puts("with High Pass\n"); 
      } 
     } else { 
      puts("Failed\n"); 
     } 
    } 
    return 0; 
} 

問題是程序沒有做什麼應該做的事情,我希望如果你能幫我找到解決方案。

+2

注意'EOF'不是字符,但對於由某些函數返回的值的宏時結束文件的條件是遇到(或在某些情況下出現錯誤時返回)。 –

+0

如果用戶輸入「A」而不輸入8,該怎麼辦? – user3629249

回答

3

如預期的2個原因的程序不發揮功能:從stdin

  • 字節不是數值:如果用戶類型1,程序接收'1'其是字符值,不是數字值。您可以通過減去'0'字符值計算數字字符的數值:

    int c = getchar(); 
    if (c >= '0' && c <= '9') { 
        int grade = c - '0'; 
        /* you can now test the grade */ 
    
  • 您一次讀取標準輸入一個字節:它不允許超過9成績。如果用戶鍵入10,則將測試2個等級並輸出Failed!兩次。

這裏是一個替換的版本與scanf()

#include <stdio.h> 

int main(void) { 
    int grade; 
    puts("Enter the grades\n"); 
    puts("Enter the EOF character to end input\n"); 

    while (scanf("%d", &grade) == 1) { 
     if (grade >= 8) { 
      puts("Passed with High Pass"); 
     } else 
     if (grade >= 5) { 
      puts("Passed"); 
     } else { 
      puts("Failed\n"); 
     } 
    } 
    return 0; 
} 
+0

夠清楚。謝謝 :) –

-1

你得到輸入數字的ascii碼,而不是它的值。將其轉換爲比較前的數字。

while ((grade = getchar()) != EOF) { 
    getchar(); // flush the \n 
    if (isdigit(grade)) 
    { 
     int intgrade = grade - '0'; 

     if (intgrade >= 5) { 
      puts("Passed"); 
      if (intgrade >= 8) { 
       puts("with High Pass\n"); 
      } 
     } 
     else { 
      puts("Failed\n"); 
     } 
    } 
    else printf("Wrong entry\n"); 
} 

return 0; 
+0

你可以做一個簡單的轉換,例如:int grade_as_int =(int)grade;' –

+1

@ m.nachury - 你不能。它不會將「1」轉換爲整數1.它將'grade_as_int'分配給等級的ascii代碼。所有將通過「高通」 –

+2

如果您插入的號碼超過一位數字,它會刷新第二位而不是'\ n',因此對於'45'輸出失敗。這是不對的。 –