我在过去的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
答案 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
的范围。