C++开发记忆小游戏时出现Expression cannot seek vector iterator after end错误
问题修复说明
错误原因汇总
- erase操作参数错误:代码中
s、p是卡片存储的字符值(如'A'对应ASCII码65),远大于vector初始长度50,cards.begin() + s会直接偏移到迭代器有效范围外,触发越界报错。正确应该使用用户输入的卡片下标n、l作为erase的偏移参数,同时注意erase顺序:先删除下标较大的元素,避免删除小下标后大下标自动前移导致的二次越界。 - 输出语句语法错误:
cout << "The first card is: " + p;写法错误,字符串常量与char类型相加是指针偏移操作,而非字符串拼接,会访问非法内存。需要改用流插入运算符<<拼接输出内容。 - 循环条件逻辑错误:50张卡片最多只能成功配对25次,原循环条件
candy<50会在卡片全部清空后仍要求用户输入,触发空vector访问越界,需要改为candy < 25或者cards.size() > 0。 - 缺少输入合法性校验:未校验用户输入的
n、l是否在[0, cards.size()-1]的合法区间,输入超出范围的数值会直接触发越界。
修正后可运行代码
#include <iostream> #include <vector> #include <algorithm> #include <random> using namespace std; void play(); void filler(); char faceup(int); vector<char> cards (50); int candy= 0; int main() { filler(); play(); cout << "所有卡片配对完成,游戏结束!" << endl; return 0; } char faceup(int C) { return cards[C]; } void play() { int n,l; char p, s; for (int i = 0; i < cards.size(); i++) { cout << cards[i]; } cout << endl; // 修正循环条件 while (candy < 25) { cout << "choose first card"<<endl; cin >> n; cout << "choose second card"<<endl; cin >> l; // 新增输入合法性校验 if (n < 0 || n >= cards.size() || l <0 || l >= cards.size()) { cout << "输入的下标超出范围,请重新输入" << endl; continue; } if (l == n) { cout << "the cards are the same, try it again"<<endl; } else { p = faceup(n); s = faceup(l); // 修正输出语法 cout << "The first card is: " << p << endl; cout << "The second card is: " << s << endl; if (s==p) { candy++; // 修正erase参数,先删大下标 if (n > l) swap(n, l); cards.erase(cards.begin() + l); cards.erase(cards.begin() + n); // 输出剩余卡片方便调试 cout << "配对成功!剩余卡片:"; for (int i = 0; i < cards.size(); i++) { cout << cards[i]; } cout << endl; } } } } void filler() { //random_device rd; //default_random_engine rng(rd()); int accountant = 0; for (int i = 0; i < cards.size()/2; i++) { for (int o = 0; o < 2; o++) { cards[accountant] = i+65; accountant++; } } //shuffle(cards.begin(), cards.end(), rng); }
内容的提问来源于stack exchange,提问作者user17411638
相关产品推荐
相关产品推荐

