我一直在调试过去2小时的这个错误,并且知道我自己如果在睡觉之前没有寻求帮助,我将无法入睡。我正在为我的游戏编写一个模型加载器,而现在我正在使用一种非常简单的方法来拆分字符串。然而,它在几乎相同的线上工作,然后随机不。我使用string.substr(),我相信这个错误意味着它试图从一个不存在于字符串中的位置开始。调用堆栈说,它在这条线发生:令人困惑的“std :: out_of_range”错误
v1 = v1.substr(s.find(",")+1);
,并使用它打印消息断点,它说
顶点1使用“1,1”,整个字符串是“ 173,1,1 175,1,1 174,1,1“
其中,顶点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,XX,X,XX,X, X“ 其中x是一个数字。
这是我能找到的分割字符串的唯一途径...
现在,我不明白为什么它在这里得到这个错误...好像它几乎只发生随机。我不明白为什么它不会与
173,1,1 175,1,1 174,1,1
工作,但它会与
175,2,2 176,2,2 175,2,2
在某人能够发现问题之前,您可能需要粘贴更多来源。 – sarnold 2011-12-18 02:04:21
请尝试创建一个[Short,self-contained,correct example](http://sscce.org)。 – Xeo 2011-12-18 02:05:20
只是在这里猜测,但如果你有一个像'hi'这样的字符串,'+ 1'可能会要求'substr'在一个无效位置开始。 – 2011-12-18 02:06:03