2011-12-18 224 views
-1

我一直在调试过去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

+3

在某人能够发现问题之前,您可能需要粘贴更多来源。 – sarnold 2011-12-18 02:04:21

+5

请尝试创建一个[Short,self-contained,correct example](http://sscce.org)。 – Xeo 2011-12-18 02:05:20

+1

只是在这里猜测,但如果你有一个像'hi'这样的字符串,'+ 1'可能会要求'substr'在一个无效位置开始。 – 2011-12-18 02:06:03

回答

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+14将超出范围v1

+0

谢谢,我可以用它来调试它,尽管它对我来说似乎仍然是随机的... – smoth190 2011-12-18 06:44:40

+1

根据你最近的代码示例,我会研究为什么你在s中找到“,”而不是在v1中。既然你使用了v1的子字符串,那么你的搜索起始字符也应该是针对该变量的。 – DRH 2011-12-18 07:39:39

+0

嗯,那有效!产生相同的结果,减去错误。 – smoth190 2011-12-18 17:04:59