用字符串拆分空检查

时间:2012-08-27 06:05:27

标签: c++ strtok string string-split

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; }

这是我的字符串拆分代码。我发送了以下字符串,用分隔符“&amp;”

进行拆分
  

“F0 = fname0&安培; 10 = 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 =”我的分隔符在字符串的最后位置。所以我找不到值是否为null。我想知道值('='的左侧是名称,右侧的值是否为空)是否为空。我怎么检查这个。

2 个答案:

答案 0 :(得分: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"));
    }
}

答案 1 :(得分:0)

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

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

<小时/> 修改:根据您的评论,然后在对字符串进行标记之前,我会使用string::findstring::replace对其进行修改,以替换“=&amp;”的出现次数用“= hi&amp;”以及“= hi”终止“=”。这样你就可以避免尴尬的解析。

此外,您不需要两次令牌传递,因为strDelimit的{​​{1}}参数可以是“&amp; =”(两次都是分隔符)。

相关问题