C 带扫描输入的开关
我的任务是编写一个简单的代码,使用while循环来测试值并返回对值的适当响应,在本例中,使用switch语句返回字母级别 我的问题是测试一个不包含整数的值。我相信我可以在switch语句之前通过IF测试解决这个问题。我正在寻求有关这项声明措辞的帮助 我知道我错过了我认为是一个任务,如果在循环后推荐。我也愿意接受关于如何检查错误并为该错误编写异常代码的建议 另外,如果有人能这么好,请您向我解释一下C 带扫描输入的开关,c,switch-statement,scanf,C,Switch Statement,Scanf,我的任务是编写一个简单的代码,使用while循环来测试值并返回对值的适当响应,在本例中,使用switch语句返回字母级别 我的问题是测试一个不包含整数的值。我相信我可以在switch语句之前通过IF测试解决这个问题。我正在寻求有关这项声明措辞的帮助 我知道我错过了我认为是一个任务,如果在循环后推荐。我也愿意接受关于如何检查错误并为该错误编写异常代码的建议 另外,如果有人能这么好,请您向我解释一下scanf是如何从输入中赋值的。我相信我的问题在于scanf如何赋值。我不认为我的代码是通过开关分析真
scanf
是如何从输入中赋值的。我相信我的问题在于scanf
如何赋值。我不认为我的代码是通过开关分析真值,而不是分析临时值
#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;
}
#包括
#包括
int main(void){
国际职系;
printf(“输入数值形式的放坡值\n”);
while((scanf(“%i”,&grades))!=EOF){
道岔(等级){
案例10:
案例9:
printf(“等级%i是A\n”,等级);
打破
案例8:
printf(“等级%i是B\n”,等级);
打破
案例7:
printf(“等级%i是C\n”,等级);
打破
案例6:
printf(“等级%i是D\n”,等级);
打破
案例5:
案例4:
案例3:
案例2:
案例1:
案例0:
printf(“等级%i为F\n”,等级);
打破
违约:
printf(“这不是一个有效的条目\n”);
}
}
返回0;
}
如果试图传递一个字符,比如a,我会得到一个无限循环错误。您应该测试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;
}
#包括
#包括
内部主(空){
char-buf[80];
国际职系;
对于(;;){
printf(“输入数值形式的放坡值\n”);
if(fgets(buf,sizeof buf,stdin)=NULL)
打破
如果(sscanf(buf、%i、&等级)!=1){
printf(“不是一个数字:%s”,buf);
继续;
}
道岔(等级){
案例10:
案例9:
printf(“等级%i是A\n”,等级);
打破
案例8:
printf(“等级%i是B\n”,等级);
打破
案例7:
printf(“等级%i是C\n”,等级);
打破
案例6:
printf(“等级%i是D\n”,等级);
打破
案例5:
案例4:
案例3:
案例2:
案例1:
案例0:
printf(“等级%i为F\n”,等级);
打破
违约:
printf(“这不是一个有效的等级:%d\n”,等级);
打破
}
}
返回0;
}
这是一个可选的解决方案,似乎与上面的代码相同
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) {
还要检查scanf
是否真的写了grades
。Olaf我相信这就是我所缺少的。我该怎么做?阅读scanf
手册页怎么样?@Olaf我发现“每个函数读取字符,根据格式解释它们,并将结果存储在其参数中。”我将其理解为将值存储到(int grades),但是,我认为我的代码不是这样工作的@你错过了部分。通读并理解它。int 1是我将要测试的一个值。这是开关里的一个箱子。我需要对非数字字符进行测试,以便一次测试多个项目。@AndrewBodin:scanf
返回成功转换的次数。如果用户键入一个非数字的等级,你到底想做什么?我试图让switch语句返回默认值。目前,它运行一个连续的循环。我愿意听取关于如何进行这项工作的建议。我无法测试ANSI特定字符是否超出范围,因为这会起作用,但取决于系统。@AndrewBodin:您可以一次读取一行并检查数字输入。请看我更新的答案。@AndrewBodin:您在buf
中读取了一行输入,然后尝试用sscanf
解析buf
一个整数。如果失败,则抱怨该行不包含数字,如果成功,则处理该数字。与前面代码的主要区别在于,它每行只处理一个数字,而前面的代码可以处理同一行上的多个数字。