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

如何消除C++函数CheckPlayerInput中的递归以避免程序崩溃

问题根源

你当前程序崩溃的核心原因有两个:

  • 递归调用无退出上限:连续输入错误时函数会不断调用自身,每次调用都会在栈内存中压入新的函数栈帧,栈空间耗尽后就会触发栈溢出崩溃
  • 输入流错误状态未清理:cin 读入失败后会被置为错误状态,你没有重置状态、清空缓冲区残留的非法数据,后续所有读操作都会直接失败,瞬间触发无限递归
修复方案

改用循环结构替代递归实现输入重试逻辑,同时补充输入流状态清理逻辑,完整修正代码如下:

#include <limits> // 需额外引入该头文件使用numeric_limits

static void CheckPlayerInput()
{
    while (true) {
        // 若input为局部变量可在此处声明 char input;
        cin >> input;

        // 处理输入流失败场景
        if (cin.fail())
        {
            cout << "Invalid character, try again!" << endl;
            // 重置输入流错误状态
            cin.clear();
            // 清空输入缓冲区所有残留数据,跳过直到换行符
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            // 进入下一轮循环重新读取输入
            continue;
        }

        // 转换为大写
        input = toupper(input);

        // 校验输入内容
        switch (input)
        {
        case '1': FillSquare(0, 0); break; //top-left
        case '2': FillSquare(0, 1); break; //top-centre
        case '3': FillSquare(0, 2); break; //top-right
        case '4': FillSquare(1, 0); break; //middle-left
        case '5': FillSquare(1, 1); break; //middle-centre
        case '6': FillSquare(1, 2); break; //middle-right
        case '7': FillSquare(2, 0); break; //bottom-left
        case '8': FillSquare(2, 1); break; //bottom-centre
        case '9': FillSquare(2, 2); break; //bottom-right
        default:
            cout << "Invalid character, try again!" << endl;
            // 清空缓冲区多余内容(防止用户输入多个字符)
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            // 进入下一轮循环重试
            continue;
        }
        // 输入合法且处理完成,跳出循环
        break;
    }
}
核心修改点说明
  • 移除所有递归调用,改用while(true)无限循环控制重试逻辑,完全规避栈溢出风险
  • 输入失败分支补充cin.clear()重置流状态,配合cin.ignore()清空缓冲区残留的非法输入,避免重复读取错误内容
  • 合法输入处理完成后直接break跳出循环,非法输入则走continue进入下一轮重试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:45:00