簡體   English   中英

令人困惑的“ std :: out_of_range”錯誤

[英]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(",")將返回3s的第一個,s中位於位置3),但是由於v1僅包含三個字符,因此唯一的有效索引在[0,2]之間。 傳入3或以+1 4傳遞將超出v1的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM