结束在C程序文件(EOF)的
我做了一个需要完成当进入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个原因的程序不发挥功能:从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;
}
够清楚。谢谢 :) –
你得到输入数字的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;
你可以做一个简单的转换,例如:int grade_as_int =(int)grade;' –
@ m.nachury - 你不能。它不会将“1”转换为整数1.它将'grade_as_int'分配给等级的ascii代码。所有将通过“高通” –
如果您插入的号码超过一位数字,它会刷新第二位而不是'\ n',因此对于'45'输出失败。这是不对的。 –
注意'EOF'不是字符,但对于由某些函数返回的值的宏时结束文件的条件是遇到(或在某些情况下出现错误时返回)。 –
如果用户输入“A”而不输入8,该怎么办? – user3629249