首页 > 解决方案 > 强制用户使用 C 中的 While 循环输入整数

问题描述

我试图让用户输入一个整数,以便稍后在程序中使用我希望它强制用户输入一个输入,直到它是一个整数。当我运行此代码时,它会像这样进入无限循环:

输入最小运算符: 输入最小运算符: 输入最小运算符: 输入最小运算符: 输入最小运算符: 输入最小运算符:......

我认为问题出在扫描仪上,但我不确定应该如何处理它。

    #include <stdio.h>
#include <ctype.h>

int main(int argc, const char * argv[]) {

    char operator;
    int largestOpperator, smallestOpperator;

    printf("Enter The Table Operator (+, -, *, /, %%, or R): ");
    scanf("%c",&operator);

    /*while(!(operator == '+' || operator == '-' || operator == '*' || operator == '/' ||operator == '%' || operator == 'R'))
    {

        printf("Enter Appropriate Table Operator (+, -, *, /, %%, or R): ");
        scanf(" %c",&operator); //requires space as a way to skip the enter when char is scanning!!
    }*/

    do{
        if(!isdigit(smallestOpperator))
            printf("Enter smallest operator: ");
        else{
            printf("Enter an actual number: ");
            scanf(" %d", &smallestOpperator);
        }

    }while(!isdigit(smallestOpperator));


    printf("Enter largest operator: ");
    scanf("%d", &largestOpperator);

    {
        printf("Enter a valid integer: ");
        scanf("%d", &largestOpperator);
    }


    return 0;
}

标签: cintegerdo-while

解决方案


显然isdigit(smallestOperator)正在返回false,因为这是 的条件while,并且您看到的是无限循环。

检查值的明智方法是在调试器smallestOperator中运行代码——这将向你显示变量的类型、它的值、它在内存中的表示——你可能需要的一切。

实现相同目的的更肮脏的方法是将调试 printfs添加到您的代码中,以在检查值之前打印该值。

但是,我们可以看到您正在使用scanf(" %d", ...)to 阅读smallestOperator. 手册页scanf说:

d - 匹配可选带符号的十进制整数;下一个指针必须是指向 int 的指针。

所以你得到一个整数scanf然后测试它是否是一个数字的字符

您有两种选择来解决此问题:

读取一个字符,测试它,转换它

从 scanf 中获取一个字符scanf(" %c", &smallestOperatorAsChar): -- 然后用 测试它isDigit(),然后将其转换为整数:将字符数字转换为 C 中的相应整数

(更好)让 scanf() 告诉你转换错误

无论如何,您应该始终检查 IO 调用的返回值。scanf()返回它成功转换的项目数。如果它小于您预期的数字,您可以使用它来触发您的错误处理。

int rc = scanf("%d", &i);
char junkChar;
while(rc < 1) {
    printf("Invalid");
    scanf("%c", &junkChar);
    rc = scanf("%d", &i);
}

请参阅:为什么 scanf 一次失败后不等待用户输入?- 接受的答案观察到这scanf()不是一个很好的标准输入机制,所以你不应该太努力地试图解决它:要么通过编写自己的例程来控制,fgets()要么引入一个更聪明的库。


推荐阅读