2017-08-12 79 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'输出失败。这是不对的。 –