2015-08-31 2 views
2

У меня есть вектор строк:станд :: строка :: зиЬзЬги бросают зЬй :: out_of_range но аргументы в пределе

vector<string> tokenTotals; 

Когда push_back называется, строка длиной 41 хранятся и я должен работать на каждом элементе моего вектора и получить две подстроки, первый в диапазоне от 0 до 28, а второй в диапазоне от 29 до 36:

for(int i = 0; i < tokenTotals.size(); i++) 
{ 
    size_t pos = tokenTotals[i].find(": "); 
    cout << tokenTotals[i] << endl; // Show all strings - OK 
    cout << tokenTotals[i].length() << endl; // Lenght: 41 
    string first = tokenTotals[i].substr(0, 28); // OK 
    string second = tokenTotals[i].substr(29, 36); // ERROR 
    cout << first << " * " << second << endl; 
} 

Но когда я пытаюсь получить вторую подстроку, я получаю следующее сообщение об ошибке :

terminate called after throwing an instance of std::out_of_range. 
what():: basic_string::substr 

Любая идея о том, что могло случиться?

ответ

11

См. std::string::substr reference. Второй параметр - это длина подстроки, не позиция символа после подстроки, поэтому результатом является попытка доступа к элементам за пределами допустимого диапазона - выбрано значение std::out_of_range.

С tokenTotals[i].substr(0, 28) эта ошибка не проявляется, так как подстрока имеет как размер и положение один конец прошлого 28.

7
substr(29,36); 

будет пытаться получить строку, которая начинается в положении 29 и имеет размер из 36 символов. К сожалению, 29 + 36> 41

documentation