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

C++校验用户输入是否为int类型时输入非法触发死循环问题求解

问题根因
  • 当cin读取整数遇到非法输入时,会同时触发两个异常状态:
    1. 输入流的fail错误位被置位,该状态不主动清除的话,后续所有cin操作都会直接跳过,不会等待用户输入
    2. 输入的非法字符会残留在输入缓冲区中,下次读取操作仍会优先读到老的错误内容,反复触发失败逻辑
解决方案

在判定cin.fail()为真后,新增两步处理:

  1. 调用cin.clear()清空输入流的错误状态位,让输入流恢复可工作状态
  2. 调用cin.ignore()清空输入缓冲区里的残留错误内容,避免重复读取旧输入
修正后的代码
// 注意如果用到numeric_limits需要提前引入<limits>头文件
#include <limits>

// ... 其他代码 ...

again1: // Inloop point 1

cout << "   " << player1 << ", where would you like to place a chip? Enter the index (1 - 9).\n" << endl;
int index1; // Initializing index 1
cin >> index1; // Writing input of player 1 into index 1

if (cin.fail()) {
    cout << "Error" << endl;
    cin.clear(); // 重置输入流错误状态
    // 清空缓冲区中所有残留内容,直到遇到换行符
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    goto again1;
}

额外提示:原代码中cout << " " + player1的写法存在风险,若player1是std::string类型," "是const char*类型,直接相加会触发指针偏移而非字符串拼接,建议统一用<<做输出流拼接。

内容的提问来源于stack exchange,提问作者user12965285

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:15:04