c - C中的猜数程序中的无限循环

标签 c scanf infinite-loop

对于 C 编程,我还是个新手。这就是为什么我通过做一些更简单的练习来提高自己的水平。我正在进行的练习是“猜测数字”游戏,用户必须猜测两个数字(上限和下限)之间的数字。该程序正在执行其必须执行的操作,但有一个异常(exception):当用户输入字符而不是整数时,程序会陷入无限循环。跳出此循环的唯一方法是使用break 语句并重新启动程序。我想要的是让程序请求用户再次输入,直到输入一个整数。

有人可以告诉我为什么程序会陷入这个无限循环,为什么它不像第一次迭代那样通过 scnanf 再次请求输入?我们将不胜感激您的帮助。谢谢。

//globals
int secret_nr;
int guess;
int upper_bound = 100;
int lower_bound = 1;
int total_guesses = 1;


void check_input(void) {
    if (guess < lower_bound || guess > upper_bound) {
        printf("Invalid input! Your guess must be between %d and %d\n", lower_bound, upper_bound);
    }
    else if (guess < secret_nr) {
        printf("Higher\n");
        total_guesses++;
    }
    else if (guess > secret_nr) {
        printf("Lower\n");
        total_guesses++;
    }
    else if (guess == secret_nr) {
        printf("correct! You guessed the number after guessing %d times!\n", total_guesses);
    }
}


int main(int argc, char* argv[]) {
    srand(time(NULL));
    secret_nr = (rand() % upper_bound) + 1;

    printf("Guess the number between %d and %d:\n", lower_bound, upper_bound);
    do {
        if (scanf("%d", &guess)) {
            check_input();
        }
        else {
            printf("Invalid input! Only integer values are allowed!\n");
            //break;
        }
    } while (guess != secret_nr);

    return 0;
}

最佳答案

如果 scanf 无法根据指定的格式解析其输入,则输入将保留在输入缓冲区中,以便下次调用 scanf 时读取完全相同的输入并再次失败。等等等等......

简单的解决方案是首先读取整行输入,例如使用fgets 。然后,您可以在该(现已提取的)输入中使用 sscanf 来尝试解析它。

<小时/>

使您的当前代码进一步复杂化的是,如果scanf以其他方式失败,它将返回EOF,它是整数-1,这是“true”。这当然也会导致你的逻辑和循环出现问题。

关于c - C中的猜数程序中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289226/

相关文章:

c - 我如何指向正确的地方?

c - 循环 while double 不等于字符?

c - 我在 C 语言中读取 .txt 文件中的单词时遇到一些问题

c - 为什么 scanf() 会导致此代码中的无限循环?

java - 使用延迟加载面板时,Wicket 无限重新加载页面

ruby-on-rails-4 - ActiveAdmin 设计 Cancancan 和三种用户模型 - 无限循环

c - 两次骰子之和的出现次数

c - 如何打印 fread()?

c - C 编程中 "&"%f", &variableName);"中的 "scanf("是什么?

c++ - 服务器程序处于无限循环中。如何检查?