高低猜数游戏:while循环中输入整数判断及无限循环修复
修复猜数字游戏的输入错误无限循环问题
问题说明
现有猜数字游戏代码在用户输入非整数(如字符串)时,会陷入无限循环,反复输出提示却无法接收新输入。原代码如下:
// Created on: Oct 2023 // This program allows the user to guess a number between 0-9 #include <stdlib.h> #include <stdio.h> #include <time.h> int main() { // this function allows the user to guess a number // and the program decides if the user is correct unsigned int seed = time(NULL); int randomNumber = rand_r(&seed) % 9; int num = 0; int scanerrorcode = 0; while (1) { printf("\nGuess a number between 0-9: "); scanf("%d", &num); if (num < 0 || num > 9) { printf("\n%d is not between 0-9", num); } else if (num == randomNumber) { printf("\nYou guessed correctly!"); break; } else if (num > randomNumber) { printf("\nYou guessed too high!"); } else if (num < randomNumber) { printf("\nYou guessed too low!"); } else { printf("\nError, %d is not a number", num); } } printf("\nDone."); }
问题根源
- 输入非整数时,
scanf("%d", &num)匹配失败,返回值不为1,但代码未检查返回值,错误输入会留在输入缓冲区,导致后续循环中scanf反复读取无效内容,触发无限循环。 - 原代码的
else分支永远不会执行,因为前面的条件已覆盖所有整数情况。 - 随机数生成用
%9,实际生成范围是0-8,不符合题目0-9的要求。
修复后的代码
// Created on: Oct 2023 // This program allows the user to guess a number between 0-9 #include <stdlib.h> #include <stdio.h> #include <time.h> int main() { unsigned int seed = time(NULL); // 修正随机数范围为0-9 int randomNumber = rand_r(&seed) % 10; int num = 0; int scan_result; while (1) { printf("\nGuess a number between 0-9: "); // 检查scanf的返回值,成功读取整数时返回1 scan_result = scanf("%d", &num); // 处理输入错误(非整数) if (scan_result != 1) { printf("\n请输入有效的整数!"); // 清空输入缓冲区的无效字符 while (getchar() != '\n'); continue; } // 检查输入范围 if (num < 0 || num > 9) { printf("\n%d 不在0-9范围内", num); } else if (num == randomNumber) { printf("\n你猜对了!"); break; } else if (num > randomNumber) { printf("\n猜大了!"); } else { printf("\n猜小了!"); } } printf("\n游戏结束。"); }
关键修复点
- 检查
scanf的返回值,判断是否成功读取整数。 - 输入错误时,用
while (getchar() != '\n')清空输入缓冲区,避免无效字符残留。 - 修正随机数生成逻辑,用
%10确保范围是0-9。 - 移除无用的
else分支,简化逻辑。
内容的提问来源于stack exchange,提问作者kakarot 22
相关产品推荐
相关产品推荐

