2012-04-17 125 views
0

我得到一个“字符串不可忽略”的错误代码,它几乎是从互联网上某处复制的。应用程序在发布模式下完美编译(VS 2010),但在调试模式下不断抛出错误。它应该将字符串拆分为*并将每个单词保存为一个向量。有没有人有任何想法?它似乎并不喜欢比较中的(string :: npos!= found)部分。C++ Tokenize字符串不可忽略

string newString = "Something*NotCool"; 

size_t found = newString.find_first_of("+*-/%()"); 
size_t lastPos = 0; 
//while (found != newString.length) 
while (string::npos != found || string::npos != lastPos) 
{ 
    if (found >= newString.length()) break; 
    if (found == lastPos) 
    { 
     lastPos = found+1; 
     found = newString.find_first_of("+*-/()", found+1); 
    } 
    string temp (newString,lastPos,found); 
    temp.assign(newString, lastPos, found-lastPos); 
    strings.push_back(temp); 
    lastPos = found+1; 
    found = newString.find_first_of("+*-/()", found + 1); 
} 

您的帮助表示感谢!

+0

它编译我使用VS 2010的(我用的CL,而不是IDE)。你将需要显示更多的代码。 – 2012-04-17 22:51:30

+0

你确定这是引发错误的代码吗?我怀疑这是添加了一些东西来避免错误信息的代码,但是它仍然存在最后一个字不会添加到'strings'的问题。另外,请注意编译器错误和运行时错误之间的区别 - 它们完全不同,并且说'完​​美编译'与说它运行没有错误消息(这与说正确运行不同)不同。 – 2012-04-17 22:56:38

+0

我想你的'if(found == lastPos)'逻辑是关闭的。这似乎试图检测一行中有两个* s,并忽略它们。但是,连续3个或更多*不会被捕获。 – Lalaland 2012-04-17 22:58:02

回答

1

你的代码在VS2010中对我没有任何错误。

既然你就可以访问正则表达式(<regex>库),另一种选择可能是:

std::string str = "Something*NotCool"; 
std::regex re("[^(\\*\\+%/\\-\\(\\))]+"); 
std::sregex_token_iterator begin(str.begin(), str.end(), re), end; 
std::vector<std::string> tokens; 
std::copy(begin, end, std::back_inserter(tokens)); 
+0

这是EPIC。非常感谢你的帮助。我只是在re(...)中添加了一个\\ /以确保它处理分隔符号(我希望我做到了这一点 - 这是一种临时测试)。看起来我有一些阅读这些“新”功能。再次感谢! – 2012-04-17 23:22:48

+0

我喜欢如何逃避正则表达式逃脱,使它爆炸成有点迷人的东西。这是它自己的小“沃尔多在哪里?”对于分隔符字符集。别忘了''%''不应该总是在那里(或者这可能是原代码中的另一个错误......) – 2012-04-17 23:41:40

+2

@MichaelBurr:这可能是为什么C++ 11引入了原始字符串文字。 – 2012-04-17 23:46:57