2016-10-07 27 views
0

我正在使用庫來解析.pgn文件,當我試圖運行該項目,我發現這個錯誤:調試斷言失敗!程序:C:\ windows \ system32 \ MSVCP110D.dll文件:c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xstring 行:79 表達式:字符串迭代器不可取消 有關如何程序可能會導致斷言失敗,請參閱斷言上的Visual C++文檔。字符串迭代器是不可取的

問題是,當迭代器到達文件末尾時,它指向無(啓動迭代器(itr1)==結束迭代器(itr2)),我試圖添加條件來檢查itr1是否到達文件的結尾,但它沒用。 那麼請告訴我我的錯在哪裏。 這裏是我的代碼source.cpp文件:

#include <iostream> 
#include <fstream> 
#include <PGNGameCollection.h> 
int main() 
{ 
    std::ifstream pgnfile("sample.pgn"); 
    pgn::GameCollection games; 
    pgnfile >> games; 
    std::cout << "the file sample.pgn contains " << games.size() << "games"  << std::endl; 
    system("pause"); 
    return 0; 
} 

這裏是類函數導致錯誤:

bool pgn::Parser::getComment(std::string::const_iterator &itr1, const std::string::const_iterator &itr2, pgn::CommentText &out) 
{ 
    std::string::const_iterator local_itr=itr1; 
    std::string comment; 
    if(*local_itr != '{') 
     return false; 
    local_itr++; //skipping '{' 

    while((*local_itr != '}') && (local_itr != itr2)) 
    { 
     comment += *local_itr++; 
    } 
    local_itr++; //skipping '}' 
    skipBlanks(local_itr, itr2); 
    itr1=local_itr; 
    out=pgn::CommentText(comment); 
    return true; 
} 

skipBlanks功能:

void pgn::Parser::skipBlanks(std::string::const_iterator &itr1, cost std::string::const_iterator &end) 
{ 
    while((itr1 != end) && (isspace(*itr1))) 
    { 
     itr1++; 
    } 
} 

我已搜查和計算器谷歌所有類似的問題,但我找不到答案。我也一行一行地追溯代碼,直到我找到導致錯誤的函數。

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

我在問這裏之前已經逐行調試了代碼,但是我找不到答案! –

+0

然後你可能會以錯誤的方式使用調試器。 –

回答

1

如果itr2是您的最終迭代器,那麼你必須前檢查的最終條件迭代器試圖取消對它的引用

while((local_itr != itr2) && (*local_itr != '}')) 

你周圍做它的其他方式,這肯定會導致到你描述的問題。

在函數的最開始處添加對結束條件的檢查也可能是有意義的,因爲在那裏您也提取local_itr

另外,如果你的週期終止,因爲local_itr達到itr2,並在itr2沒有什麼和之後,則循環後的代碼是沒有意義的。在這種情況下,您不得增加local_itr

+0

我試過了,但是出現了與Expression相同的錯誤信息:字符串迭代器不是增量式的 –

+0

@Norhan Foda:嗯......同樣的?它是如何相同的?你引用你的原始錯誤爲「字符串迭代器是**不可忽略**」,現在你得到「**不可遞增**」。 「不可增量」是一個完全不同的錯誤,它來自你在循環之後執行'local_itr ++'的嘗試。如果你達到目的,後者是沒有意義的。這是一個不同的問題,需要單獨修復。如果已經達到最後,不要嘗試增加迭代器或從中讀取任何內容。 – AnT

+0

我檢查迭代器是否到達如下所示的末端:if(itr1!= itr2){local_itr ++;}所以local_itr只會在文件結束時纔會增加。這將我帶回到字符串迭代器而不是可忽略的。 –