这个问题的标题很难说,但我希望你能原谅我,我将在这里详细说明。 我遇到的问题是我的C程序充斥着控制台"输入学生的成绩:F"如果我输入除整数之外的任何东西。我是C的新手,所以我不明白如何检查输入是否属于有效类型。
int main() {
int grade; //number 0-10 associated with the letter grade
while (1) {
printf("Enter the student's grade: ");
scanf("%i", &grade);
switch (grade) {
case 10: printf("A \n"); break;
case 9: printf("A \n"); break;
case 8: printf("B \n"); break;
case 7: printf("C \n"); break;
case 6: printf("D \n"); break;
case 5: printf("F \n"); break;
case 4: printf("F \n"); break;
case 3: printf("F \n"); break;
case 2: printf("F \n"); break;
case 1: printf("F \n"); break;
case 0: printf("F \n"); break;
default: printf("Please enter a valid test score \n"); break;
}
}
return 0;
}
感谢您的帮助!
答案 0 :(得分:2)
检查FetchFile
是否成功。
scanf
查找任何书籍,您都会知道int nread = scanf("%i", &grade);
if (nread != 1) // scanf failed, start cleanup
{
scanf("%*[^\n]%*c");
}
会返回已成功阅读的元素数量,因此如果您输入一个字母,它将无法读取整数并返回scanf
(没有读过),那么你就可以知道有什么不对劲并丢弃错误的东西。
由于0
在遇到错误时没有读取任何内容,错误的内容将保留在输入缓冲区中,严重的是它会破坏下一个scanf
,导致无限输出刷新
P.S。您不需要在scanf
之后重复语句,只需将它们合并为一个:
case 5 4 3...
答案 1 :(得分:0)
检查scanf的返回。 1表示已成功扫描整数。 0表示输入不是整数。清理输入流并重试。
#include <stdio.h>
int main ( void) {
int grade; //number 0-10 associated with the letter grade
int valid = 0;
while (1) {
do {
printf("Enter the student's grade: ");
if ( 1 != ( valid = scanf("%i", &grade))) {// 1 is success
if ( EOF == valid) {
printf ( "found EOF\n");
return 0;
}
while ( '\n' != getchar ( )) {//clear input stream
}
}
} while ( !valid);
switch (grade) {
case 10: printf("A \n"); break;
case 9: printf("A \n"); break;
case 8: printf("B \n"); break;
case 7: printf("C \n"); break;
case 6: printf("D \n"); break;
case 5: printf("F \n"); break;
case 4: printf("F \n"); break;
case 3: printf("F \n"); break;
case 2: printf("F \n"); break;
case 1: printf("F \n"); break;
case 0: printf("F \n"); break;
default: printf("Please enter a valid test score \n"); break;
}
}
return 0;
}