对于 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/