【问题标题】:Forcing user to enter an Integer using a While loop in C强制用户使用 C 中的 While 循环输入整数
【发布时间】:2018-10-16 23:50:03
【问题描述】:

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

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

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

    #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;
}

【问题讨论】:

  • 你能发布整个程序而不是sn-p吗?
  • 不要在代码块中省略 { 大括号 }。它是吸引错误的磁铁;最好永远不要这样做,这样你就不会犯这些错误了。
  • 什么是smallestOpperator,显示它是如何声明的。还有:smallestOpperator 在你的代码之前已经初始化了吗?如果不是,那么您的代码无论如何都是完全错误的。请显示更多相关代码。阅读:minimal reproducible example
  • 不要使用scanf 进行用户输入。阅读:stackoverflow.com/questions/2144459/…
  • isdigit 作用于字符,而不作用于整数;但是,您将整数读入smallestOpperator,因此isdigit 通常会失败。解决方案:使用scanf 中的%c 将一个字符读入smallestOpperator

标签: c integer do-while


【解决方案1】:

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

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

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

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

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

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

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

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

从scanf获取一个charscanf(" %c", &amp;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() 不是一个很好的标准输入机制,所以你不应该努力解决它:要么通过编写自己的控制来控制fgets() 周围的例程或引入更聪明的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2020-02-15
    • 2020-02-15
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多