std :: string :: substr抛出std :: out_of_range但参数是限制的

时间:2015-08-31 19:42:12

标签: c++ string substr outofrangeexception

我有一个字符串向量:

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

知道会发生什么事吗?

2 个答案:

答案 0 :(得分:11)

请参阅std::string::substr reference。第二个参数是子字符串的长度不是子字符串后面字符的位置,因此结果是尝试访问超出范围的元素 - {{1抛出。

std::out_of_range这个错误没有显现出来,因为子字符串的大小和位置都超过了28。

答案 1 :(得分:7)

substr(29,36);

将尝试获取一个从第29位开始并且大小为36个字符的字符串。不幸的是29 + 36&gt; 41

documentation