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

C++简易解释器报vector subscript out of range错误求助

问题分析与修复

你的代码触发"vector subscript out of range"错误主要有以下几个原因:

1. brk_token函数未处理最后一个token

当输入字符串不以分隔符:结尾时,循环结束后最后一个token不会被添加到vector中。比如输入print:hello,循环处理到:时把print加入vector,处理完hello后循环直接结束,hello没有被push_back到vector,导致vector仅包含1个元素,此时访问[1]必然触发越界。

2. 未检查vector元素数量就直接访问下标

无论输入是否包含:,你都直接访问返回vector的[0]和[1]下标。如果输入没有冒号(比如随机字符、空行),vector元素数量不足2个,直接访问下标会触发越界错误。

3. 重复调用brk_token且参数传递冗余

每次判断和输出都重复调用brk_token,既浪费性能,也可能导致多次解析的不一致;另外program.c_str()是C风格字符串,直接传递program(std::string类型)给函数更合理,无需额外转换。


修复后的代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> brk_token(string text, char breakon) {
    vector<string> tokens;
    string token = "";
    for (int i = 0; i < text.size(); i++) {
        if (text.at(i) != breakon) {
            token += text.at(i);
        } else {
            tokens.push_back(token);
            token = "";
        }
    }
    // 处理循环结束后剩余的最后一个token
    if (!token.empty()) {
        tokens.push_back(token);
    }
    return tokens;
}

int main() {
    string program;
    while (true) {
        getline(cin, program);
        
        // 优先处理退出命令,避免无效解析
        if (program == "break") {
            break;
        }
        
        vector<string> tokens = brk_token(program, ':');
        // 先检查token数量是否符合命令格式要求
        if (tokens.size() >= 2) {
            if (tokens[0] == "print") {
                cout << tokens[1];
            } else if (tokens[0] == "printnl") {
                cout << tokens[1] << "\n";
            }
        }
        // 若token数量不足,不执行任何操作,避免越界
    }
    return 0;
}

额外优化建议

  • 避免使用using namespace std;,大型项目中容易引发命名冲突,建议显式使用std::前缀。
  • 添加未知命令的提示逻辑,比如当tokens[0]不是print或printnl时,输出错误提示。
  • 可以单独处理空输入的情况,提升程序健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:01:09