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

C++用vector存储问答对时输入正确答案仍死循环如何解决

问题分析
  • 输入读取逻辑错误:你所有读取用户答案的代码都使用了cin >>,该操作默认以空格、换行、制表符作为分隔符,遇到包含空格的答案(比如第二题的Nile River)时,一次读取只会拿到空格前的部分内容,无法和完整的正确答案匹配,导致进入correct函数的答错循环后永远无法满足退出条件。
  • 循环终止条件失效:主函数while循环的判断条件是lives > 0,但你全程没有修改lives数值的逻辑,lives永远等于初始值3,就算所有题目都答完,循环也不会停止,还会因为firstquestion超出vector的索引范围触发数组越界崩溃。
修复方案
  1. 替换输入读取方式
    将所有读取答案的cin >>替换为getline(cin, 变量名),可以读取包含空格的整行内容。注意如果之前有其他cin操作残留了换行符,需要先调用cin.ignore()清空缓冲区,示例如下:
// 主函数中的输入代码
cout<<"Your Answer: "<<endl;
cin.ignore();
getline(cin, answer);

// correct函数中的输入代码
cout<<"Answer: "<<endl;
cin.ignore();
getline(cin, tempor);
  1. 补全生命值扣减逻辑
    答错时扣减lives数值,同时判断生命值是否耗尽,提前终止流程。可以将lives以引用的形式传入correct函数,或者将其设置为QandA类的成员变量,答错分支示例修改如下:
void QandA::correct(std::string answer,int numquestion, int& lives) // 增加lives引用传参
{
    string tempor;
    if (answer == Answers[numquestion])
    {
        cout<<"Correct"<<endl;
        givescore();
    }
    else
    {
        do
        {
            lives--;
            if(lives <= 0) {
                cout << "生命值耗尽,游戏结束" << endl;
                return;
            }
            cout<<"Wrong Answer,剩余生命值:" << lives << endl;
            givequestion(numquestion);
            cout<<"Answer: "<<endl;
            cin.ignore();
            getline(cin, tempor);
            answer = tempor;
        }while(answer != Answers[numquestion] && lives > 0);
        if(answer == Answers[numquestion]) {
            cout<<"correct"<<endl;
            givescore();
        }
    }
}
  1. 补全题目边界判断
    主函数循环条件增加题目索引的边界校验,避免超出vector长度触发越界:
while (lives > 0 && firstquestion < Questions.size())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:18:02