猜数字游戏输入校验异常:非数字输入后持续显示数字范围问题
解决猜数字游戏输入校验后的范围错误问题
你遇到的问题是输入非数字内容时,程序错误输出了数字范围,核心原因是输入错误处理逻辑没阻断后续的范围判断代码,且输入缓冲区处理不彻底,导致流程混乱。
修正后的代码
#include <iostream> #include <ctime> #include <limits> using namespace std; int main () { srand(time(0)); int guessnum; int ansnum = rand() % 100 + 1; int upi = 100; int lowi = 1; cout << "Guess the number(1-100): "; // 初始输入的合法性校验 while (!(cin >> guessnum)) { cin.clear(); // 清除cin的错误状态标记 // 清空输入缓冲区里的所有无效内容,直到换行 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Input A number(1-100): "; } do{ // 只有输入有效时才更新并显示范围 if (guessnum < ansnum) { lowi = guessnum; cout << lowi << " - " << upi << '\n'; } else if (guessnum > ansnum) { upi = guessnum; cout << lowi << " - " << upi << '\n'; } // 猜中直接退出循环,不用再提示输入 if (guessnum == ansnum) break; cout << "Guess the number again: "; // 再次输入的合法性校验 while (!(cin >> guessnum)) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Input A number(1-100): "; } } while (true); cout << "Congratulation! You WIN!"; return 0; }
关键修改说明
- 补全初始输入校验:原来的初始输入没有错误处理,输入非数字会直接进入主循环的错误分支,现在一开始就校验输入合法性。
- 彻底清空输入缓冲区:用
cin.ignore替代getline,能更彻底地清除输入缓冲区里的无效内容,避免残留字符干扰后续输入读取。 - 阻断错误输入后的范围逻辑:输入错误时,会在
while循环里一直等待有效输入,不会进入后面的范围判断代码,也就不会错误显示数字范围。 - 拆分判断分支:把原来的else拆成
guessnum > ansnum和等于的情况,避免猜中时还输出范围,逻辑更精准。
内容的提问来源于stack exchange,提问作者Ainz Ooal
相关产品推荐
相关产品推荐

