嗨我试图让我的程序从文件中读取一行,将其按空格分成一个向量,然后对该向量进行操作。当我运行程序时,我得到上面的错误,我猜这意味着即时调用一个不存在的向量槽。有问题的代码如下,但我无法弄清楚我的错误的确切部分。任何帮助将不胜感激。
while (getline(fin,temp))
{
vector<string> token;
split(token,temp,is_any_of(" "));
// check and print the tokens to new file
for (int i = 0; i < token.size(); i++)
{
string uni = token[i];
string bi = token[i]+" "+token[i+1];
string tri = token[i]+" "+token[i+1]+" "+token[i+2];
if(Filter.check(tri)==true)
{
token[i],token[i+1],token[i+2]==censor;
outputFile<<token[i]<<" "<<token[i+1]<<" "<<token[i+2];
i+3;
}
else if(Filter.check(bi)==true)
{
token[i],token[i+1]==censor;
outputFile<<token[i]<<" "<<token[i+1];
i+2;
}
else if(Filter.check(uni)==true)
{
token[i]==censor;
outputFile<<token[i];
i++;
}
else
outputFile<<token[i];
}
outputFile<<endl;
}
为了帮助理解我在做什么,程序应检查特定单词或短语的行,用检查员替换它们,然后将这些单词输出到文件中。
编辑:好的,所以我已经将for循环更改为:
for (int i = 0; i < token.size()-2; i++)
但我仍然遇到同样的错误。有什么想法吗?
答案 0 :(得分:3)
这一行
string bi = token[i]+" "+token[i+1];
当i
为token.size()-1
时,访问超出数组长度的元素。同样,这一行
string tri = token[i]+" "+token[i+1]+" "+token[i+2];
结束了两个元素。
将循环更改为token.size()-3
以停止解决此问题:
for (int i = 0; i < token.size()-2; i++)
...
或在循环中添加检查以查看i
是否小到足以在其后抓取一个或两个元素。
答案 1 :(得分:2)
在您的代码中使用语句:
for (int i = 0; i < token.size(); i++)
string bi = token[i]+" "+token[i+1];
string tri = token[i]+" "+token[i+1]+" "+token[i+2];
i = token.size() - 1
会怎样?
你会尝试阅读
token[token.size() - 1] + " " + toke[token.size()] + token[token.size()+1]
最后两个值超出了矢量范围
答案 2 :(得分:0)
其他答案给出了错误的指示。但是,即使您试图阻止循环越过边缘,您的代码仍然会被破坏。
如果有2个或更少的令牌,这将导致调试断言(在Visual Studio中)
string bi = token[i]+" "+token[i+1]; // <-- debug assertion if only 1 token
string tri = token[i]+" "+token[i+1]+" "+token[i+2]; // <-- assertion if only 2 tokens
当您第一次进入循环时,您正在尝试获取第二个令牌,但如果只有一个令牌,则没有第二个令牌。
类似地,如果只有2个令牌,则循环初始条目的第二行尝试获取第三个令牌,但没有第三个令牌。
所以你应该做的是确保在进入循环之前有3个或更多的标记。
if (token.size() < 3 )
return;
for (int i = 0; i < token.size(); i++)
或者重写你的循环以处理1或2个令牌。