强制用户使用C中的While循环输入整数

时间:2018-10-16 14:47:47

标签: c integer do-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;
}

1 个答案:

答案 0 :(得分:0)

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

检查smallestOperator的值的明智方法是在 debugger 中运行代码-这将向您显示变量的类型,其值,其在内存中代表性-您可能需要的一切。

实现同一目标的更肮脏的方法是在代码中添加 debugging printfs ,以便在检查之前打印该值。

但是,我们可以看到您正在使用scanf(" %d", ...)来读取smallestOperatorscanf的联机帮助页显示:

  

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

因此,您从scanf得到一个整数,然后进行测试以查看它是否是一个数字的字符

您有两种方法可以解决此问题:

阅读一个字符,对其进行测试,对其进行转换

从scanf中获取一个 char scanf(" %c", &smallestOperatorAsChar)-然后用isDigit()对其进行测试,然后将其转换为整数:Convert a character digit to the corresponding integer in C

(更好)让scanf()告诉您有关转换错误的信息

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

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

请参阅:why does scanf not wait for user input after it fails one time? -在已接受的答案中,观察到scanf()不是一种很好的stdin输入机制,因此您不应该太努力地尝试解决它:要么控制住,要么通过围绕fgets()编写自己的例程或引入一个更聪明的库。