字符串迭代器不可取消引用
string iterator is not dereferencable
我正在使用一个库来解析 .pgn 文件,当我尝试 运行 项目时,我发现这个 error:Debug 断言失败!程序:C:\windows\SYSTEM32\MSVCP110D.dll 文件:c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring
Line:79
Expression:string 迭代器不可取消引用
有关您的程序如何导致断言失败的信息,请参阅有关断言的可视化 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;
}
这里是导致错误的 class 函数:
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++;
}
}
我已经在 Whosebug 和 google 中搜索了所有类似的问题,但我找不到答案。我还逐行跟踪代码,直到找到导致错误的函数。
如果 itr2
是您的结束迭代器,那么您必须在 尝试取消引用它之前 检查您的迭代器的结束条件
while((local_itr != itr2) && (*local_itr != '}'))
你反着来,肯定会出现你描述的问题。
在函数的最开始添加结束条件检查可能也有意义,因为在那里您也取消了引用 local_itr
。
此外,如果您的循环因为 local_itr
达到 itr2
而终止,并且在 itr2
和之后没有任何内容,那么循环之后的代码就没有意义了。在这种情况下,您不能增加 local_itr
。
我正在使用一个库来解析 .pgn 文件,当我尝试 运行 项目时,我发现这个 error:Debug 断言失败!程序:C:\windows\SYSTEM32\MSVCP110D.dll 文件:c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring Line:79 Expression:string 迭代器不可取消引用 有关您的程序如何导致断言失败的信息,请参阅有关断言的可视化 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;
}
这里是导致错误的 class 函数:
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++;
}
}
我已经在 Whosebug 和 google 中搜索了所有类似的问题,但我找不到答案。我还逐行跟踪代码,直到找到导致错误的函数。
如果 itr2
是您的结束迭代器,那么您必须在 尝试取消引用它之前 检查您的迭代器的结束条件
while((local_itr != itr2) && (*local_itr != '}'))
你反着来,肯定会出现你描述的问题。
在函数的最开始添加结束条件检查可能也有意义,因为在那里您也取消了引用 local_itr
。
此外,如果您的循环因为 local_itr
达到 itr2
而终止,并且在 itr2
和之后没有任何内容,那么循环之后的代码就没有意义了。在这种情况下,您不能增加 local_itr
。