[英]Confusing “std::out_of_range” Error
最近兩個小時,我一直在調試此錯誤,並且我知道自己上床睡覺之前如果不尋求幫助,我將無法入睡。 我正在為我的游戲編寫模型加載器,而現在我正在使用一種非常脆弱的方法來拆分字符串。 但是,它可以在幾乎相同的行上工作,然后隨機不行。 我正在使用string.substr(),並且我相信該錯誤意味着它試圖從字符串中不存在的位置開始。 調用堆棧說明了它在以下行上發生的情況:
v1 = v1.substr(s.find(",")+1);
通過使用打印消息的斷點,它說
頂點1使用“ 1,1”,整個字符串為“ 173,1,1 175,1,1 174,1,1”
其中“頂點1”是v1的值,“字符串”是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's'總是像這樣:“ 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
我不確定我在正確解釋您的問題,但是鑒於您提供的信息,這似乎是您在做什么:
#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
的第一個,
在s
中位於位置3),但是由於v1
僅包含三個字符,因此唯一的有效索引在[0,2]
之間。 傳入3
或以+1
4
傳遞將超出v1
的范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.