簡體   English   中英

空檢查與字符串拆分

[英]Empty check with 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; }

這是我的字符串拆分代碼。 我發送了以下字符串以使用分隔符'&'進行拆分

“ 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。 我想知道值(“ =”的左側是名稱,右側的一個是value)是否為空。 我該如何檢查。

怎么樣? 我認為這是分割字符串的最簡單方法。

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

檢查您要標記的字符串的最后一個字符是否實際上是分隔符本身。

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


編輯:根據您的評論,然后在標記字符串之前,我將使用string::findstring::replace對其進行修改,以將出現的“ =&” string::replace為“ = hi&”,並將終止的“ =”替換為“ = hi” 。 這樣,您將避免笨拙的解析。

同樣,您將不需要進行兩次標記化,因為strtokstrDelimit參數可以為“&=”(一次通過兩個定界符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM