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=" の場合、文字列の最後の位置にセパレーターがあります。そのため、値が null であるかどうかを見つけることができませんでした。値 (「=」の左側が名前、右側が値) が空かどうかを知りたいです。どうすればこれを確認できますか。

4

2 に答える 2

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"));
    }
}
于 2012-08-27T06:17:01.853 に答える
0

トークン化する文字列の最後の文字が実際にセパレータ自体であるかどうかを確認します。

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


編集:あなたのコメントに基づいて、文字列をトークン化する前に、「=&」の出現箇所を「= hi&」に置き換え、終了する「=」を「=hi」に置き換えることでstring::find文字列を変更します。string::replaceそうすることで、厄介な構文解析を回避できます。

strDelimitまた、のパラメータはstrtok「&=」(1つのパスの両方の区切り文字)になる可能性があるため、トークン化の2つのパスは必要ありません。

于 2012-08-27T06:22:20.653 に答える