2012-08-27 156 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。 –