在抛出' std :: out_of_range',string的向量的实例后调用C ++终止

时间:2014-04-10 20:58:57

标签: c++ c++11 outofrangeexception

运行时出现此错误:

  

在抛出'std :: out_of_range'的实例后调用终止what():basic_string :: substr

问题出现在这部分代码中,但我全新,我不明白我应该如何解决这个问题。 content是我的字符串向量。

    int i=1;
    std::string v1, v2, weight;
    while(!content.empty())
    {
        v1 = content[i].substr(2,1);
        v2 = content[i].substr(5,1);
        weight = content[i].substr(8,1);
        i++;
    }

2 个答案:

答案 0 :(得分:3)

这里有两个主要问题。

你的循环将永远持续(或直到你从无效访问中谋杀你的RAM棒),因为你只检查向量是否为空,而不是检查i是否已达到其总大小。

for (auto& x : content) {
    const std::string v1     = x.substr(2,1);
    const std::string v2     = x.substr(5,1);
    const std::string weight = x.substr(8,1);

    // Presumably actually do something with these now
}

然后你需要修复你的substr操作,这些操作有错误的参数,从而导致异常。

答案 1 :(得分:2)

让我们尝试修复您的程序代码段:

int i=1;
std::string v1, v2, weight;
while( i < content.size() && content[i].size() >= 8 )
{
    v1 = content[i].substr(2,1);
    v2 = content[i].substr(5,1);
    weight = content[i].substr(8,1);
    i++;
}

这是最小的修复。我更喜欢:

std::string v1, v2, weight;
content.erase(content.begin());
for( const auto& x: content )
{
    if( x.size() < 8 )
         continue; // or break, whatever is best

    v1 = x.substr(2,1);
    v2 = x.substr(5,1);
    weight = x.substr(8,1);
}

您还可以改变对较短项目的处理方式:

inline int guarded_substr(const std::string& s, std::size_t begin, size_t size) {
    return s.size() >= begin+size ? s.substr(begin, size) : std::string();
}

std::string v1, v2, weight;
content.erase(content.begin());
for( const auto& x: content )
{
    v1 = guarded_substr(x,2,1);
    v2 = guarded_substr(x,5,1);
    weight = guarded_substr(x,8,1);
}

等等......