C++写的split(string) 函数

本文介绍了一个在C++标准库中实现的高效字符串分割函数,该函数能够根据指定分隔符将字符串分割成多个子串,并提供是否保留空串的选项。同时,还提供了使用完整分隔串进行分割的函数。通过示例代码演示了如何使用这两个函数,包括处理空串和使用自定义分隔符的能力。
摘要由CSDN通过智能技术生成

source: http://guoxinmiao8.blog.sohu.com/102130312.html

一个十分有用的标准C++写的split(string) 函数


  1. /******************************************** 
  2.  
  3.   the tokenize function for std::string 
  4.  
  5. *********************************************/  
  6. #include <string>  
  7. #include <vector>  
  8. #include <iostream>  
  9. using namespace std;  
  10.   
  11. typedef basic_string<char>::size_type S_T;  
  12. static const S_T npos = -1;  
  13.   
  14. trim指示是否保留空串,默认为保留。  
  15. vector<string> tokenize(const string& src, string tok,    
  16.   
  17. bool trim=false, string null_subst="")  
  18. {  
  19.  if( src.empty() || tok.empty() ) throw "tokenize: empty  
  20.  
  21. string\0";  
  22.    
  23.  vector<string> v;  
  24.  S_T pre_index = 0, index = 0, len = 0;  
  25.  while( (index = src.find_first_of(tok, pre_index)) !=   
  26.   
  27. npos )  
  28.  {  
  29.   if( (len = index-pre_index)!=0 )  
  30.    v.push_back(src.substr(pre_index, len));  
  31.   else if(trim==false)  
  32.    v.push_back(null_subst);  
  33.   pre_index = index+1;  
  34.  }  
  35.  string endstr = src.substr(pre_index);  
  36.  if( trim==false ) v.push_back( endstr.empty()?   
  37.   
  38. null_subst:endstr );  
  39.  else if( !endstr.empty() ) v.push_back(endstr);  
  40.  return v;  
  41. }  
/********************************************  the tokenize function for std::string*********************************************/#include <string>#include <vector>#include <iostream>using namespace std;typedef basic_string<char>::size_type S_T;static const S_T npos = -1;trim指示是否保留空串,默认为保留。vector<string> tokenize(const string& src, string tok,  bool trim=false, string null_subst=""){ if( src.empty() || tok.empty() ) throw "tokenize: empty string\0"; vector<string> v; S_T pre_index = 0, index = 0, len = 0; while( (index = src.find_first_of(tok, pre_index)) != npos ) {  if( (len = index-pre_index)!=0 )   v.push_back(src.substr(pre_index, len));  else if(trim==false)   v.push_back(null_subst);  pre_index = index+1; } string endstr = src.substr(pre_index); if( trim==false ) v.push_back( endstr.empty()? null_subst:endstr ); else if( !endstr.empty() ) v.push_back(endstr); return v;}

使用一个完整的串delimit(而不是其中的

某个字符)来分割src串,没有trim选项,即严格分割。

  1. vector<string> split(const string& src, string delimit,   
  2.   
  3. string null_subst="")  
  4. {  
  5.  if( src.empty() || delimit.empty() ) throw "split:  
  6.  
  7. empty string\0";  
  8.   
  9.  vector<string> v;  
  10.  S_T deli_len = delimit.size();  
  11.  long index = npos, last_search_position = 0;  
  12.  while( (index=src.find(delimit,   
  13.   
  14. last_search_position))!=npos )  
  15.  {  
  16.   if(index==last_search_position)  
  17.    v.push_back(null_subst);  
  18.   else  
  19.    v.push_back( src.substr(last_search_position, index-  
  20.   
  21. last_search_position) );  
  22.   last_search_position = index + deli_len;  
  23.  }  
  24.  string last_one = src.substr(last_search_position);  
  25.  v.push_back( last_one.empty()? null_subst:last_one );  
  26.  return v;  
  27. }  
vector<string> split(const string& src, string delimit, string null_subst=""){ if( src.empty() || delimit.empty() ) throw "split: empty string\0"; vector<string> v; S_T deli_len = delimit.size(); long index = npos, last_search_position = 0; while( (index=src.find(delimit, last_search_position))!=npos ) {  if(index==last_search_position)   v.push_back(null_subst);  else   v.push_back( src.substr(last_search_position, index-last_search_position) );  last_search_position = index + deli_len; } string last_one = src.substr(last_search_position); v.push_back( last_one.empty()? null_subst:last_one ); return v;}


// test

  1. int main(void)  
  2. {  
  3.  string src = ",ab,cde;,,fg,," ;  
  4.  string tok = ",;" ;  
  5.   
  6.  vector<string> v1 = tokenize(src, tok ,true);  
  7.  vector<string> v2 = tokenize(src, tok ,false,   
  8.   
  9. "<null>");  
  10.   
  11.  cout<<"-------------v1:"<<endl;  
  12.  for(int i=0; i<v1.size();i++)  
  13.  {  
  14.   cout<<v1[i].c_str()<<endl;  
  15.  }  
  16.    
  17.  cout<<"-------------v2:"<<endl;  
  18.  for(int j=0; j<v2.size();j++)  
  19.  {  
  20.   cout<<v2[j].c_str()<<endl;  
  21.  }  
  22.   
  23.  try{  
  24.    
  25.   string s = "######123#4###56########789###";  
  26.   string del = "";//"###";  
  27.   vector<string> v3 = split(s, del, "<null>");  
  28.   cout<<"-------------v3:"<<endl;  
  29.   for(int k=0; k<v3.size();k++)  
  30.   {  
  31.    cout<<v3[k].c_str()<<endl;  
  32.   }  
  33.  }  
  34.  catch (char *s) {  
  35.   cout<<s<<endl;  
  36.  }  
  37.   
  38.  return 0;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值