【问题标题】:Why will my program not flag characters?为什么我的程序不会标记字符?
【发布时间】:2015-12-10 23:52:14
【问题描述】:

我正在使用 switch 语句制作这个程序,该语句将根据用户是否输入数字 0 - 10 来分配字母等级。如果用户输入的数字不是 0-10,则程序会输出一条错误消息并显示用户重新输入。但是,如果用户输入一个字符,程序将在默认情况下循环。我希望它从默认情况下输出一次错误消息,如果他们输入一个字符,让他们重新输入。我不确定为什么在输入字符时它会循环默认大小写。

#include <stdio.h>

int main()
{
    int grade;
    int r;
    while((r = scanf("%i", &grade)) != EOF)
    {
        switch(grade)
            {
                case 10:
                case 9:
                    printf("Your grade is an A\n");
                    break;
                case 8:
                    printf("Your grade is a B\n");
                    break;
                case 7:
                    printf("Your grade is a C\n");
                    break;
                case 6:
                    printf("Your grade is a D\n");
                    break;
                case 5:
                case 4:
                case 3:
                case 2:
                case 1:
                case 0:
                    printf("Your grade is an F\n");
                    break;
                default:
                    printf("Invalid score, please re-enter\n");
            }
    }

    return 0;
}

【问题讨论】:

  • 提示:如果您输入的内容无效,scanf 会返回什么? (您可以通过阅读文档找到这一点)
  • 您将scanf 的返回值保存到r 中(这很好),但您只是在检查EOF。如果用户输入了无法转换为数字的内容,r 将为零,否则为一。
  • 测试应该是== 1而不是!= EOF
  • 您可能应该使用 %d 而不是 %i 。例如,%i 会将010 转换为8
  • @M.M:我的错,对不起。

标签: c


【解决方案1】:

尝试类似:

#include <stdio.h>

int main()
{
    int grade;
    int r=0;
    while(r != 1)
    {
    scanf("%i", &grade);
        switch(grade)
            {
                case 10:
                case 9:
                    printf("Your grade is an A\n");
                    r=1
                    break;
                case 8:
                    printf("Your grade is a B\n");
                    r=1
                    break;
                case 7:
                    printf("Your grade is a C\n");
                    r=1
                    break;
                case 6:
                    printf("Your grade is a D\n");
                    r=1
                    break;
                case 5:
                case 4:
                case 3:
                case 2:
                case 1:
                case 0:
                    printf("Your grade is an F\n");
                    r=1
                    break;
                default:
                    printf("Invalid score, please re-enter\n");
                    break;
            }
    }

    return 0;
}

【讨论】:

  • 但我的 while 会在 r =1 时中断,所以在用户输入有效分数之前,它会是一个无限循环
【解决方案2】:

这将清除无效输入的输入缓冲区并允许重试。

#include <stdio.h>

int main()
{
    int grade;
    int r;
    while((r = scanf("%i", &grade)) != EOF)
    {
        if ( r != 1) {//r == 1 is successful input of integer
            grade = -1;//reset grade on invalid input
        }
        switch(grade)
        {
            case 10:
            case 9:
                printf("Your grade is an A\n");
                break;
            case 8:
                printf("Your grade is a B\n");
                break;
            case 7:
                printf("Your grade is a C\n");
                break;
            case 6:
                printf("Your grade is a D\n");
                break;
            case 5:
            case 4:
            case 3:
            case 2:
            case 1:
            case 0:
                printf("Your grade is an F\n");
                break;
            default:
                printf("Invalid score, please re-enter\n");
                while ( getchar() != '\n');//clear input buffer
        }
    }
    return 0;
}

【讨论】:

    【解决方案3】:

    你的代码总是循环的原因是因为除了杀死程序之外没有办法退出你的while。请记住,break 只会跳出最里面的switch 或循环。

    打破多个级别的最简洁方法是使用标志。一种做你想做的事情的方法是这样的:

    bool valid_grade = false;
    while(!valid_grade && (r = scanf("%i", &grade)) != EOF)
    {
        valid_grade = true;
        switch(grade)
            {
                case 10:
    
                 // unchanged from your code
    
                default:
                    valid_grade = false;
                    printf("Invalid score, please re-enter\n");
            }
    }
    

    【讨论】:

    • 这可行,但一旦检测到不正确的数据,它将退出程序。我主要对如何让它正确刷新数据感到困惑,并继续要求用户输入直到 EOF
    • @retrohelix94 会一直询问是否有无效输入,一旦输入正确就退出。这不是你想要的吗?
    猜你喜欢
    • 2011-11-13
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2021-11-26
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多