我希望在这个程序中使用一个堆栈,但它不会让我。我一直得到一个段错误11.我通过制作一个新的向量并将其设置为等于第一个向量然后弹出新向量来解决这个问题。但我最终需要将弹出的向量与第一个向量同步,但它会引发段错误11。
无论如何这里是代码,它是另一个项目的一部分,但我不认为上下文太重要了解它的用途。这也是在我运行此方法时编译它会抛出错误。
void print_well_formed_file(ifstream& ifs) {
vector<string> vec;
vector<string> finalVec;
string line;
string a;
string temp;
string final;
Lexer lexer;
Token tok;
while (getline(ifs, line)) {
lexer.set_input(line);
while (lexer.has_more_token()) {
tok = lexer.next_token();
switch (tok.type) {
case TAG:
if (tok.value[0] != '/'){
a = (tok.value);
if (a == "red") {
a = "\033[31m";
}
if (a == "green") {
a = "\033[32m";
}
if (a == "blue") {
a = "\033[34m";
}
if (a == "yellow") {
a = "\033[33m";
}
if (a == "magenta") {
a = "\033[31m";
}
if (a == "cyan") {
a = "\033[36m";
}
if (a == "dim") {
a = "\033[2m";
}
if (a == "underline") {
a = "\033[4m";
}
if (a == "bright") {
a = "\033[1m";
}
vec.push_back(a);
final = temp + a;
}
else{
string s;
string temp;
string fin;
finalVec = vec;
if(!finalVec.empty()){finalVec.pop_back();}
a = "\033[0m" + finalVec.back();
temp = final;
final = temp + a;
if(!vec.empty()){vec.pop_back();} // throws an error
vec = finalVec; // throws an error
}
break;
case IDENT:
a= (tok.value)+ " ";
temp = final;
final = temp + a;
break;
}
}
}
cout << final << endl;
}
答案 0 :(得分:1)
您无法从空向量中弹出或获取元素。这是未定义的行为,它可能会使您的应用程序崩溃。
您可以通过检查代码中每次访问之前的长度来验证这是否是问题(您只是“随机”选择了最新更新中的某个位置)。看,这很简单..如果它是空的,只显示一条错误消息。
答案 1 :(得分:1)
if(!finalVec.empty()){finalVec.pop_back();}
a = "\033[0m" + finalVec.back(); // <-- bug
显然是错误的:finalVec.back()
可能不存在:因为刚刚弹出了最后一个元素,所以向量可能是空的。