gpt4 book ai didi

c++ - vector 下标超出范围?

转载 作者:行者123 更新时间:2023-11-30 03:44:27 24 4
gpt4 key购买 nike

我正在编写自己的编程语言(用于学习),但出现错误。

Debug Assertion Failed!
Program: C:/Path/MSVCP140D.dll
Line: 1232

Expression vector subscript out of range

For information how your progr... (Not important)

出错的函数:

Parser::Parser(std::vector<std::string> toks) {
for (unsigned i = 0; i < toks.size(); i++) {
if (toks[i++] + " " + toks[i] == "PRINT STRING:") {
std::cout << toks[i += 1] << std::endl;
}

if (toks[i++] + " " + toks[i] == "ASM STRING:") {
std::cout << "FOUND ASM" << std::endl;
}
}
}

生成toks的函数:

Lexer::Lexer(std::string source){
std::string tok = "";
std::string string = "";
int state = 0;

for (int i = 0; i <= source.length(); i++) {
tok += source[i];

if (tok == " ") {
if (state == 1) {
string += tok;
} else tok = "";
} else if (tok == "\n") {
tok = "";
} else if (tok == "print") {
tokens.push_back("PRINT");
tok = "";
} else if (tok == "asm") {
tokens.push_back("ASM");
tok = "";
} else if (tok == "\"") {
if (state == 0) {
state = 1;
} else if (state == 1) {
tokens.push_back("STRING:");
tokens.push_back(string);
string = "";
state = 0;
tok = "";
}
} else if (state == 1) {
string += source[i];
tok = "";
}
}
}

输出:

toks that are generated: PRINTSTRING:print  expASMSTRING:ams  exp
toks one by one:
PRINT
STRING:
print exp
ASM
STRING:
ams exp

最佳答案

我相信你唯一想增加 i 的时间是在这里:

for (unsigned i = 0; i < toks.size(); i++)
// ^^^

toks[i++] 然后 toks[i] 在没有检查的循环中会变得非常糟糕。应该是 toks[i + 1],记住 i + 1 不能达到 toks.size()?同样的:toks[i += 1]

也许你应该在循环体和这个:

for (unsigned i = 0; i + 2 < toks.size(); i += 3)

还有一个问题是:

for (int i = 0; i <= source.length(); i++)
// ^^
// should be <

不知道是不是这样

关于c++ - vector 下标超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35445440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com