使用scanf输入切换

时间:2016-03-21 21:53:09

标签: c switch-statement scanf

我的任务是使用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等字符,我会收到无限循环错误。

2 个答案:

答案 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) {