调试断言失败。 C ++向量下标超出范围

时间:2015-05-04 20:20:41

标签: c++ vector

嗨我试图让我的程序从文件中读取一行,将其按空格分成一个向量,然后对该向量进行操作。当我运行程序时,我得到上面的错误,我猜这意味着即时调用一个不存在的向量槽。有问题的代码如下,但我无法弄清楚我的错误的确切部分。任何帮助将不胜感激。

     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++)

但我仍然遇到同样的错误。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这一行

string bi = token[i]+" "+token[i+1];
itoken.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个令牌。