2015-05-04 3 views
-2

Привет, я пытаюсь заставить мою программу читать в строке из файла, разбивать ее по пробелу на вектор и затем действовать на этот вектор. Когда я запускаю программу, я получаю указанную выше ошибку, которую Im guessing означает, что im вызывает векторный слот, который не существует. Код, о котором идет речь, ниже, но у меня возникли проблемы с выяснением точной части моей ошибки. Любая помощь будет оценена по достоинству.Ошибка отладки. C++ векторный индекс вне диапазона

 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; 

} 

Чтобы понять, что им делать, то программа должна проверить линии для конкретных слов или фраз, замените их цензором, и вывод этих слов в файл.

EDIT: Хорошо, таким образом Ive изменил цикл выглядеть так:

for (int i = 0; i < token.size()-2; i++) 

Но я все еще получаю ту же ошибку. Есть идеи?

+0

@ 0x1337: Если он был пуст, петля не запускалась вообще. –

+1

Что должна делать эта строка: 'token [i], токен [i + 1], токен [i + 2] == цензор;'? – dasblinkenlight

+0

Цензор - это строка = "****", и я просто понял, что должно быть = цензор не ==, хотя это не связано с проблемой. – CoreyHall

ответ

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 достаточно мал, чтобы захватить один или два элемента после него.

+0

Я понимаю, что вы имеете в виду. Я изменил это, чтобы остановить раннее, как вы сказали, но я все еще получаю сообщение об ошибке. – CoreyHall

+1

@CoreyHall Если это Visual Studio, вы должны уметь видеть, какая строка вашего кода приводит к тому, что подстрочный индекс выходит за пределы диапазона, идя по стоп-лоту после утверждения. – drescherjm

+0

@drescherjm Да, но когда я нажимаю Retry для отладки, он уведомляет меня о том, что программа разбилась. – CoreyHall

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] 

Последние два значения из вектора диапазона

+0

Я отредактировал, чтобы остановить раньше, но я все еще получаю ошибку. – CoreyHall

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 

При первом входе в цикл, вы пытаетесь захватить второй маркер, но если есть только 1 токен, нет второго токена.

Аналогично, если есть только 2 жетона, вторая строка в исходном элементе цикла пытается захватить третий токен, но нет третьего токена.

Итак, что вы должны делать, это гарантировать, что есть 3 или более токенов до, вы вводите петлю.

if (token.size() < 3) 
    return; 
for (int i = 0; i < token.size(); i++) 

Либо это, либо переписать петлю для обработки 1 или 2 жетонов.

+0

Хорошо, я понимаю. Я вижу, могу ли я исправить это, спасибо. – CoreyHall