C-如何限制用户输入非数字字符



嗨,请看一下此代码:

while (cont == 1) {
    ...
    scanf_s("%d", &input);
    if (0 < input <= 5){
        switch (input) {
        case 1:
            printf("1");
            break;
        case 2:
            printf("2");
            break;
        case 3:
            printf("3");
            break;
        case 4:
            printf("4");
            break;
        case 5:
            cont = 0;
            break;
        default:
            printf("Wrong input !");
            break;
        }
    }else{
        printf("Error, Not a number !");
    }
}

如果我输入了不是数字的东西,它会导致无限循环。我如何限制字符输入?

您可以使用以下方式:

if(scanf_s("%d", &input) != 1) {
    printf("Wrong input !");
    break;
}

您应该始终检查scanf_s的返回值。

scanf_s()失败后,您需要读取至少一个字符(失败的字符(;通常,丢弃用户输入的其余行是最有意义的:

while (cont == 1) {
    int rc;
    ...
    if ((rc = scanf_s("%d", &input)) < 0)
    {
        printf("EOF detectedn");
        break;
    }
    if (rc == 0)
    {
        int c;
        while ((c = getchar()) != EOF && c != 'n')
            ;
        printf("Error, Not a number!n");
        continue;     
    }
    if (0 < input <= 5){
        switch (input) {
        case 1:
        case 2:
        case 3:
        case 4:
            printf("%d", input);
            break;
        case 5:
            cont = 0;
            break;
        default:
            printf("Wrong input (1-5 required)!n");
            break;
        }
    }
}

如果在" Gobble"循环中检测到EOF,则可以在其中检测到EOF并立即重复打印并打破循环。OTOH,下一个scanf_s()也应报告EOF,因此不是100%。这有点取决于提示发生的位置;如果您获得EOF,则可能不应该再次提示,因此也许在内部循环之后进行测试:

if (c == EOF)
{
    printf("EOF detectedn");
    break;
}
else
{
    printf("Error, not a numbern");
    continue;
}

您可以使用读取到newline或Digit的" Gobble"循环的变体,并使用ungetch(c, stdin);将数字返回输入流以进行下一个呼叫scanf_s()进行处理 - 您可能不会提示如果要处理已经输入的数字(这会感到困惑(,请使用更多输入。

您可以玩的其他游戏。要考虑的一种选择是在放弃之前限制输入失败的数量 - 如果用户没有在10次尝试中输入有效的数字,则可能不会进行。

请注意,错误处理如何告诉用户有效的数字范围是什么?这有助于他们正确。另请注意,这些消息最终具有新线。这通常是一个好主意。在交互式I/O之外的上下文中,NewLine可以帮助确保输出在打印时出现,而不是在某些其他打印添加newline或输出缓冲区填充且待处理的数据毕竟刷新的任意时间。

相关内容

  • 没有找到相关文章

最新更新