我的任务是使用while循环编写一个简单的代码来测试值并返回对值的相应响应,在这种情况下使用switch语句进行字母等级。
我的问题是测试一个不包含整数的值。我相信我可以在switch语句之前用IF测试解决问题。我正在寻求帮助来表达这一陈述。
我知道我错过了我认为如果在循环之后推荐的作业。我也愿意接受如何检查错误以及写错误代码的建议。
此外,如果有人可以这么善良,你会向我解释scanf
如何根据输入分配值。我相信我的问题在于scanf
如何分配价值观。我不认为我的代码通过switch
与临时值解析真值。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int grades;
printf("Enter a value for grading in numeric form\n");
while ((scanf("%i", &grades)) != EOF) {
switch (grades) {
case 10:
case 9:
printf("A grade of %i is an A\n", grades);
break;
case 8:
printf("A grade of %i is an B\n", grades);
break;
case 7:
printf("A grade of %i is an C\n", grades);
break;
case 6:
printf("A grade of %i is an D\n", grades);
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("A grade of %i is an F\n", grades);
break;
default:
printf("This is not a valid entry\n");
}
}
return 0;
}
如果尝试传递A等字符,我会收到无限循环错误。
答案 0 :(得分:2)
您应该测试scanf
返回1
而不是仅检查文件结尾。如果您键入非数字输入,scanf
将失败并返回0
但在stdin
中保留有问题的输入,则循环体将执行grades
的潜在无效值以及下一个while (scanf("%i", &grades) == 1) {
...
}
迭代再次失败......无限期。
将代码更改为:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buf[80];
int grades;
for (;;) {
printf("Enter a value for grading in numeric form\n");
if (fgets(buf, sizeof buf, stdin) == NULL)
break;
if (sscanf(buf, "%i", &grades) != 1) {
printf("not a number: %s", buf);
continue;
}
switch (grades) {
case 10:
case 9:
printf("A grade of %i is an A\n", grades);
break;
case 8:
printf("A grade of %i is an B\n", grades);
break;
case 7:
printf("A grade of %i is an C\n", grades);
break;
case 6:
printf("A grade of %i is an D\n", grades);
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("A grade of %i is an F\n", grades);
break;
default:
printf("This is not a valid grade: %d\n", grades);
break;
}
}
return 0;
}
如果您希望在输入无效的情况下重新启动循环,请将代码更改为:
_dict
答案 1 :(得分:1)
这适用于作为可选解决方案,它似乎与上面的代码相同。
int main(void) {
int grades;
int temp;
while((temp = scanf("%i", &grades)) != EOF)
{
if(temp == 0)
{
printf("Invalid charactur\ne");
while(getchar() != '\n')
;
}
else
switch (grades) {