You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

猜数字游戏输入校验异常:非数字输入后持续显示数字范围问题

解决猜数字游戏输入校验后的范围错误问题

你遇到的问题是输入非数字内容时,程序错误输出了数字范围,核心原因是输入错误处理逻辑没阻断后续的范围判断代码,且输入缓冲区处理不彻底,导致流程混乱。

修正后的代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:26:24