Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
由于需要使用c++对字符串进行切割
故对相关的知识做一个总结
1.使用
std::stringstream
切割字符串
比如:
    std::stringstream str(text);
    std::
string tok;
    
while(getline(str,tok,(char)32)){}
2.还是使用std::stringstream流析出
比如:
    std::stringstream str(s);
    
string t1,t2,t3,t4;
    str 
>>t1;
    str 
>>t2;
    str 
>>t3;
    str 
>>t4;
3.使用strtok
比如:
char* token = strtok(str.c_str()," ");
4.使用boost的
tokenizer
比如:
boost::tokenizer<> ss(s,char_separator(' '));
for(boost::tokenizer<>::iterator beg=ss.begin(); beg!=ss.end(); ++beg){cout<<*beg<<endl;}
不过其默认的分隔为空格和标点符号
如果需要定制其模板参数
可以按照下面的书写:
class char_separator
{
public:      
    char_separator(
char c):sep(c){}
    
void reset(){}
    template 
<typename InputIterator,typename Token>
    
bool operator()(InputIterator& next,InputIterator end,Token& tok)
    {
        tok 
= Token();
        
for(;next != end && *next == sep;++next);
        
if (next == end) 
            
return false;
        
for(;next != end && *next != sep;++next)
        {
            tok 
+= *next;
        }
        
return true;
    }
private:
    
char sep;
}; 
比如:
boost::tokenizer<char_separator> mytok(str,char_separator('@'));
    
for(boost::tokenizer<char_separator>::iterator beg=mytok.begin(); beg!=mytok.end(); ++beg)
    {
        
if(index == 0)
            text1 
= *beg;
        
else if(index == 1)
            text2 
= *beg;
        
else if(index == 2)
            text3 
= *beg;
        
else if(index == 3)
            text4 
= *beg;            
        index
++;
    }
5.还是boost.
#include <cstdlib>
#include 
<iostream>
#include 
<string>
#include 
<vector>
#include 
<iostream>
#include 
<iterator>
#include 
<functional>
#include 
<boost/algorithm/string/classification.hpp>
#include 
<boost/algorithm/string/split.hpp>
#include 
<boost/algorithm/string/find_iterator.hpp>

using namespace std;
using namespace boost;

int main(int argc, char *argv[])
{
    vector
<string> strlist;
    
string str("12 34 56 678  ccsdu2004");
    split(strlist,str,is_any_of(
" "),token_compress_on);

    
for(unsigned int index=0;index<strlist.size();index++)
    {
        cout
<<index <<":"<<strlist[index]<<endl;
    };
        
    system(
"PAUSE");
    
return EXIT_SUCCESS;
}
6.其他不知道的方法若干
...

posted on 2010-08-04 14:16 ccsdu2009 阅读(2719) 评论(3)  编辑 收藏 引用 所属分类: 杂项
Comments
  • # re: c++字符串切割
    又一法
    Posted @ 2010-08-06 17:15
    // From the Chromium source code:

    template<typename STR>
    static size_t TokenizeT(const STR& str,
    const STR& delimiters,
    std::vector<STR>* tokens) {
    tokens->clear();

    typename STR::size_type start = str.find_first_not_of(delimiters);
    while (start != STR::npos) {
    typename STR::size_type end = str.find_first_of(delimiters, start + 1);
    if (end == STR::npos) {
    tokens->push_back(str.substr(start));
    break;
    }
    else {
    tokens->push_back(str.substr(start, end - start));
    start = str.find_first_not_of(delimiters, end + 1);
    }
    }

    return tokens->size();
    }

    size_t Tokenize(const std::wstring& str,
    const std::wstring& delimiters,
    std::vector<std::wstring>* tokens) {
    return TokenizeT(str, delimiters, tokens);
    }

    size_t Tokenize(const std::string& str,
    const std::string& delimiters,
    std::vector<std::string>* tokens) {
    return TokenizeT(str, delimiters, tokens);
    }

    size_t Tokenize(const Base::StringPiece& str,
    const Base::StringPiece& delimiters,
    std::vector<Base::StringPiece>* tokens) {
    return TokenizeT(str, delimiters, tokens);
    }
      回复  更多评论   
  • # re: c++字符串切割
    小志
    Posted @ 2010-08-06 17:52
    什么叫字符串切割??  回复  更多评论   
  • # re: c++字符串切割
    陈梓瀚(vczh)
    Posted @ 2010-08-08 23:57
    用C++0x最新tr1::regex类  回复  更多评论   

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理