当我将'q'
作为grade
输入时,它会无限运行。
#include <stdio.h>
#include <stdbool.h>
int main(void) {
int grade;
bool flag = true;
while (flag) {
puts("-----------------------------"); // comment
printf("What's your grade out of 10? ");
scanf(" %d", &grade);
switch (grade) {
case 10:
case 9:
case 8:
case 7:
case 6:
printf("Pass\n");
break;
case 5:
printf("Fail\n");
break;
case 4:
printf("Fail\n");
break;
case 3:
printf("Fail\n");
break;
case 2:
printf("Fail\n");
break;
case 1:
printf("Fail\n");
break;
case 0:
printf("Fail\n");
break;
default:
printf("Illegal Grade\n");
flag = false;
break;
}
}
return 0;
}
答案 0 :(得分:4)
scanf(" %d",&grade);
它在字符串中扫描int
。 &#34; Q&#34;不是int
。当您输入&#34; q&#34;时,变量grade
的值保持不变。您必须检查scanf
的返回值以验证填充占位符的数量。
if (scanf(" %d",&grade) != 1) {
printf("Illegal Grade\n");
exit(1); // or break
}
其他部分都可以。
答案 1 :(得分:3)
scanf(" %d", &grade);
失败。 grade
未被修改,因此如果转换错误立即发生并且行为未定义,则它未初始化,否则您将获得与上一次相同的值和行为。
有问题的输入保留在输入流中,因此当代码在while
循环中再次执行时会发生同样的事情,因此无限循环。
您想测试转换是否成功,如果不是,则放弃输入:
#include <stdio.h>
#include <stdbool.h>
int main(void) {
int res, c, grade;
bool flag = true;
while (flag) {
puts("-----------------------------"); // comment
printf("What's your grade out of 10? ");
res = scanf("%d", &grade);
if (res == EOF)
break;
if (res == 0) {
printf("Invalid input\n");
/* discard the offending line of input */
while ((c = getchar()) != EOF && c != '\n')
continue;
/* try again */
continue;
}
switch (grade) {
case 10:
case 9:
case 8:
case 7:
case 6:
printf("Pass\n");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("Fail\n");
break;
default:
printf("Illegal Grade\n");
flag = false;
break;
}
}
return 0;
}