2015-08-31 23 views
2

我有字符串矢量:的std :: string :: SUBSTR抛出的std :: 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

相关问题