2014-06-20 103 views
-1

奇怪的是,我的代碼編譯與mingw編譯器很好,但作爲Im我的項目轉移到Visual Studio Express我無法運行/調試我的代碼到目前爲止沒有這個錯誤警告框彈出:http://imgur.com/0vr10noMSVS Express警告:'調試斷言失敗,字符串下標超出範圍'

它說錯誤是在MSVCP120D.dll的行1685,這完全讓我感到困惑。這是我在項目中實現的最新代碼,導致警告錯誤開始彈出。

SYA::SYA(std::string p_input) { 
std::vector<std::string> infix = inputToInfix(p_input); 
for (std::size_t i = 0; i < infix.size(); i++) 
    std::cout << infix[i] << "\n"; 

}

std::vector<std::string> SYA::inputToInfix(std::string p_input) { 
std::vector<std::string> infix; 
std::size_t prevPos = 0, pos = 0; 
while (pos != std::string::npos) { 
    pos = p_input.find_first_of("+-*/%^", prevPos); 
    if (pos > prevPos) 
     infix.push_back(p_input.substr(prevPos, pos - prevPos)); 
    infix.push_back(std::string(1, p_input[pos])); 
    prevPos = pos + 1; 
} 
return infix; 

}

我雙重檢查我的代碼,並且我確定我不是犯了一個錯誤與迭代器和走出去的一個字符串的範圍,其怪我錯誤說它在MSVCP120D.dll的第1685行,並且我在使用mingw之前對相同的代碼沒有問題。任何人都可以給我一些見解嗎?我怎樣才能讓這個錯誤停止?

+0

_'I我重複檢查了我的代碼...'_使用調試器並逐步通過? –

+0

由於'p_input.find_first_of(「+ - * /%^」,prevPos),'pos'可能會變成'-1';'不? –

+0

我使用了提供的調試器並嘗試破譯這些錯誤,但是正如你可能會告訴我不是C++/Visual Studio中最有經驗的人,所以我不能從中獲益太多。我在做什麼,我已經廣泛搜索,但只發現了類似的錯誤消息,不適用於我。 – user3760908

回答

1

std::string::npos通常是(size_t) -1。但這是因爲size_t正數是無符號,在32位機是0xffffffff所以(pos > prevPos)是永諾真(後posnposprevPos將被設置爲npos + 1又名0

在這裏死

infix.push_back(std::string(1, p_input[pos])); 

posstd::string::npos。對於處理器來說,在有符號和無符號之間沒有區別,它只是試圖獲得p_input[-1]。這將始終有效,因爲數組總是在它們之前有一點空間,這就是它在MinGW上的原因。另一方面,您正試圖獲得-p_input的第012個元素,這顯然是不可能的,所以MSVC運行時在檢查邊界時會引發錯誤。