2012-08-27 120 views
0
vector<string> SplitString (string aString,char *sep) 
{ 
    vector<string> vec; 
    char * cstr,*val,*p; 
    string str = aString; 
    cstr = new char [str.size()+1]; 
    strcpy (cstr, str.c_str()); 
    p=strtok (cstr,sep); 
    while(p!=NULL) 
    {  
    vec.push_back(p); 
    p=strtok(NULL,sep); 

    }delete[] cstr;return vec; } 

这是我的字符串拆分代码。我发送的下面字符串分隔符“&”用字符串拆分的空检查

"f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=".

我在向量得到的结果如下面分裂。

f0=fname0 l0=lname0 f1=fname1 l1=lname1 f2=fname2 l2=lname2 f3= l3=

现在我再次发送带分隔符'='的结果字符串。 它与“l2 = lname2”正常工作。但对于“f3 =”和“l3 =”我的分隔符在字符串的最后位置。所以我找不到该值为空。我想知道值('='的左侧是名称,右侧是值)是否为空。我如何检查这一点。

+0

您可能对[此问题]感兴趣(http://stackoverflow.com/questions/236129/splitting-a-string-in-c)。 –

回答

0

提升如何?我认为这是拆分字符串最简单的方法。

#include <algorithm> 
#include <iterator> 
#include <boost/algorithm/string.hpp> 
using namespace std; 
using namespace boost; 

int main() 
{ 
    string s("f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3="); 

    vector<string> v1;  
    split(v1, s, is_any_of("&"), token_compress_on); 
    copy(v1.begin(), v1.end(), ostream_iterator<string>(cout, "\n"));  

    for (auto i : v1) { 
     vector<string> v2; 
     split(v2, i, is_any_of("="), token_compress_on); 

     copy(v2.begin(), v2.end(), ostream_iterator<string>(cout, "\n===\n")); 
    } 
} 
+0

致命错误:boost/algorithm/string.hpp:没有这样的文件或目录 编译终止。 –

+0

@SmithDwayne,当然你需要安装它http://www.boost.org/ – fasked

0

检查您标记的字符串的最后一个字符是否实际上是分隔符本身。

while (p != NULL && p[strlen(p) - 1] != *sep) 


编辑:基于您的评论,然后tokenising字符串之前,我会用 string::findstring::replace用来替换的“= &”事件“=喜&”,并终止“修改= “with”= hi“。这样你就可以避免尴尬的解析。

此外,你不需要两次令牌化,因为strtokstrDelimit参数可以是“& =”(一次都是分隔符)。

+0

结果和以前一样。如果我找到一个空字符串,我想推“hi”这样的字符串。如果我的字符串像“f2 = fname2&l2 = lname2&f3 =&l3 =”的意思是,我想推向量为f2,fname2,l2,lname2,f3,hi,l3,hi。 –