C 带扫描输入的开关

C 带扫描输入的开关,c,switch-statement,scanf,C,Switch Statement,Scanf,我的任务是编写一个简单的代码,使用while循环来测试值并返回对值的适当响应,在本例中,使用switch语句返回字母级别 我的问题是测试一个不包含整数的值。我相信我可以在switch语句之前通过IF测试解决这个问题。我正在寻求有关这项声明措辞的帮助 我知道我错过了我认为是一个任务,如果在循环后推荐。我也愿意接受关于如何检查错误并为该错误编写异常代码的建议 另外,如果有人能这么好,请您向我解释一下scanf是如何从输入中赋值的。我相信我的问题在于scanf如何赋值。我不认为我的代码是通过开关分析真

我的任务是编写一个简单的代码,使用while循环来测试值并返回对值的适当响应,在本例中,使用switch语句返回字母级别

我的问题是测试一个不包含整数的值。我相信我可以在switch语句之前通过IF测试解决这个问题。我正在寻求有关这项声明措辞的帮助

我知道我错过了我认为是一个任务,如果在循环后推荐。我也愿意接受关于如何检查错误并为该错误编写异常代码的建议

另外,如果有人能这么好,请您向我解释一下
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
一个整数。如果失败,则抱怨该行不包含数字,如果成功,则处理该数字。与前面代码的主要区别在于,它每行只处理一个数字,而前面的代码可以处理同一行上的多个数字。