令人困惑的“std :: out_of_range”错误

时间:2011-12-18 02:02:00

标签: c++ stdstring

我在过去的2个小时里一直在调试这个错误,并且知道如果我在睡觉前没有求助,我将无法入睡。我正在为我的游戏编写一个模型加载器,而且就目前而言,我正在使用一种非常脆弱的方法来分割字符串。但是,它在几乎相同的线上工作,然后随机不工作。我正在使用string.substr(),我相信错误意味着它试图从字符串中不存在的位置开始。调用堆栈说它发生在这一行:

v1 = v1.substr(s.find(",")+1);

并使用打印消息的断点,它说

  

顶点1使用“1,1”,整个字符串为“173,1,1 175,1,1   174,1,1"

其中Vertex 1是v1的值,string是s的值。

这是整个功能:

FaceData data;
s = s.substr(5); //remove "FACE "
string v1, v2, v3;

//vertex 1
v1 = s.substr(0, s.find(" "));

data.vertexIndexes[0] = atoi(v1.substr(0, s.find(",")).c_str());
v1 = v1.substr(s.find(",")+1);
data.textureIndexes[0] = atoi(v1.substr(0, s.find(",")).c_str());
v1 = v1.substr(s.find(",")+1);
data.normalIndexes[0] = atoi(v1.c_str());

//vertex 2
s = s.substr(s.find(" ")+1);
v2 = s.substr(0, s.find(" "));

data.vertexIndexes[1] = atoi(v2.substr(0, s.find(",")).c_str());
v2 = v2.substr(s.find(",")+1);
data.textureIndexes[1] = atoi(v2.substr(0, s.find(",")).c_str());
v2 = v2.substr(s.find(",")+1);
data.normalIndexes[1] = atoi(v2.c_str());

//vertex 3
s = s.substr(s.find(" ")+1);
v3 = s;

data.vertexIndexes[2] = atoi(v3.substr(0, s.find(",")).c_str());
v3 = v3.substr(s.find(",")+1);
data.textureIndexes[2] = atoi(v3.substr(0, s.find(",")).c_str());
v3 = v3.substr(s.find(",")+1);
data.normalIndexes[2] = atoi(v3.c_str());

return data;

传递给函数的std :: string'总是如下所示: “FACE X,X,X X,X,X X,X,X” 其中x是数字。

这是我找到分裂字符串的唯一方法......

现在,我不明白为什么会出现这个错误......似乎它几乎就是随机发生的。我无法理解为什么它不能与

一起使用
  

173,1,1 175,1,1 174,1,1

但它可以与

一起使用
  

175,2,2 176,2,2 175,2,2

1 个答案:

答案 0 :(得分:5)

我不确定我是否正确地解释了您的问题,但鉴于您提供的信息,这似乎就是您正在做的事情:

#include <string>
#include <iostream>

int main() {
    std::string v1 = "1,1";
    std::string s = "173,1,1 175,1,1 174,1,1";

    try {
        v1 = v1.substr(s.find(",")+1);
    }
    catch (const std::out_of_range& e) {
        std::cout << "out_of_range: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}

在这种情况下,s.find(",")将返回3,中的第一个s位于第3位),但由于v1只有三个字符唯一有效的索引介于[0,2]之间。传递3或使用+1 4将超出v1的范围。