C++用vector存储问答对时输入正确答案仍死循环如何解决
问题分析
- 输入读取逻辑错误:你所有读取用户答案的代码都使用了
cin >>,该操作默认以空格、换行、制表符作为分隔符,遇到包含空格的答案(比如第二题的Nile River)时,一次读取只会拿到空格前的部分内容,无法和完整的正确答案匹配,导致进入correct函数的答错循环后永远无法满足退出条件。 - 循环终止条件失效:主函数while循环的判断条件是
lives > 0,但你全程没有修改lives数值的逻辑,lives永远等于初始值3,就算所有题目都答完,循环也不会停止,还会因为firstquestion超出vector的索引范围触发数组越界崩溃。
修复方案
- 替换输入读取方式
将所有读取答案的cin >>替换为getline(cin, 变量名),可以读取包含空格的整行内容。注意如果之前有其他cin操作残留了换行符,需要先调用cin.ignore()清空缓冲区,示例如下:
// 主函数中的输入代码 cout<<"Your Answer: "<<endl; cin.ignore(); getline(cin, answer); // correct函数中的输入代码 cout<<"Answer: "<<endl; cin.ignore(); getline(cin, tempor);
- 补全生命值扣减逻辑
答错时扣减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(); } } }
- 补全题目边界判断
主函数循环条件增加题目索引的边界校验,避免超出vector长度触发越界:
while (lives > 0 && firstquestion < Questions.size())
内容的提问来源于stack exchange,提问作者Waitwhat
相关产品推荐
相关产品推荐

