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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:03