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
相关产品推荐
相关产品推荐

