2011-12-18 83 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