空管检查与字符串分割(Empty check with string split)

2019-07-31 05:03发布

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 =”我在字符串的最后位置分隔符。 所以我找不到值为null或不是。 我想知道是否值(的“=”左边是名称,右侧是一个值)为空。 我怎样才能检查。

Answer 1:

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

#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"));
    }
}


Answer 2:

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

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


编辑:基于您的评论,然后tokenising我会使用修改字符串之前string::findstring::replace取代的“=”和“=喜&”和终止“=”与事件“=喜” 。 这样一来,你会避免尴尬的解析。

此外,那么你就不会需要tokenising的两道因strDelimit的参数strtok就可以在“&=”(无论是在一个通分隔符)。



文章来源: Empty check with string split