我是靠谱客的博主 大气未来,最近开发中收集的这篇文章主要介绍在C++中如何分隔字符串,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1使用boost  regex

#include <string>

#include <iostream>

#include <iterator>

#include <boost/regex.hpp>

#include <boost/algorithm/string/regex.hpp>

#include <vector>

using namespace std;

using namespace boost;

int main()

{

  string str = "abc1234def->ijkl->mnop56qrs->tuv7890wxyz" ;

  vector< string > result;

  boost::algorithm::split_regex( result, str,

                                 regex( "[0-9]+|->" ) ) ;

  copy( result.begin(), result.end(),

        ostream_iterator<string>( cout, "n" ) ) ;

}

2、使用std::stringstream

//这个使用基本的stringstream功能,实际上我们可以指定std::istringstream分隔符

 

#include <iostream>

#include <sstream>

#include <string>

using namespace std;

 

int main()

{

    string s("Somewhere down the road");

    istringstream iss(s);

    do

    {

        string sub;

        iss >> sub;

        cout << "Substring: " << sub << endl;

    } while (iss);

 

    return 0;

}

 

3、它使用真正的C++算法和迭代器概念

 

#include <iostream>

#include <string>

#include <sstream>

#include <algorithm>

#include <iterator>

 

int main() {

    using namespace std;

    string sentence = "Something in the way she moves...";

    istringstream iss(sentence);

    copy(istream_iterator<string>(iss),

             istream_iterator<string>(),

             ostream_iterator<string>(cout, "n"));

}

 

4、调用getline算法,似乎相当合适

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {

    std::stringstream ss(s);

    std::string item;

    while(std::getline(ss, item, delim)) {

        elems.push_back(item);

    }

    return elems;

}

5、

使用boost库

下面将使用boost中多个库,它们实际上从多个方面多个方式解决同一个问题。

//----------------------------------------------------------

//这个好像是最简单不过的了

 

#include <boost/algorithm/string.hpp>

std::vector<std::string> strs;

boost::split(strs, "string to split", boost::is_any_of("t "));

 

 

//--------------------------------------------------------------

//使用boost中专门用户分隔的库,tokenizer,这实际上是一个分隔框架

#include <iostream>

#include <string>

#include <boost/foreach.hpp>

#include <boost/tokenizer.hpp>

 

using namespace std;

using namespace boost;

 

int main(int argc, char** argv)

{

   string text = "token  testtstring";

 

   char_separator<char> sep(" t");

   tokenizer<char_separator<char>> tokens(text, sep);

   BOOST_FOREACH(string t, tokens)

   {

      cout << t << "." << endl;

   }

}

 

 

//--------------------------------------------------------------------

6、这个使用boost字符串算法库,string_algo

#include <iostream>

#include <vector>

#include <boost/algorithm/string.hpp>

 

template<typename _OutputIterator>

inline void split(

    const std::string& str, 

    const std::string& delim, 

    _OutputIterator result)

{

    using namespace boost::algorithm;

    typedef split_iterator<std::string::iterator> It;

 

    for(It iter=make_split_iterator(str, first_finder(delim, is_equal()));

            iter!=It();

            ++iter)

    {

        *(result++) = boost::copy_range<std::string>(*iter);

    }

}

 

int main(int argc, char* argv[])

{

    using namespace std;

 

    vector<string> splitted;

    split("HelloFOOworldFOO!", "FOO", back_inserter(splitted));

 

    // or directly to console, for example

    split("HelloFOOworldFOO!", "FOO", ostream_iterator<string>(cout, "n"));

    return 0;

}

 

string message = "A^B^C^D"; vector<string> tokens; boost::split(tokens, message, boost::is_any_of("^"));

 

boost::char_separator<char> sep("^"); boost::tokenizer<boost::char_separator<char> > tokens(text, sep);

//-----------------------------------------------------------------------------

7、这个使用正则表达式库,可以使用正则表达式作为分隔符

#include <iostream>

#include <string>

#include <boost/regex.hpp>

 

int main() {

    std::string line("A:::line::to:split");

    const boost::regex re(":+"); // one or more colons

 

    // -1 means find inverse matches aka split

    boost::sregex_token_iterator tokens(line.begin(),line.end(),re,-1);

    boost::sregex_token_iterator end;

 

    for (; tokens != end; ++tokens)

        std::cout << *tokens << std::endl;

}

8手工解析或使用strtok

 

#include <iostream>

#include <string>

#include <vector>

 

using namespace std;

 

vector<string> split(string str, const char delim) {

    vector<string> v;

    string tmp;

    string::iterator i;

 

    for(i = str.begin(); i <= str.end(); ++i) {

        if((const char)*i != delim  && i != str.end()) {

            tmp += *i; 

        } else {

            v.push_back(tmp);

            tmp = ""; 

        }   

    }   

 

    return v;

}

 

 

//-----------------------------------------------------------------

//这个使用标准C里提供的一个函数,strtok

#include<string>

using namespace std;

 

vector<string> split(char* str,const char* delim)

{

    char* token = strtok(str,delim);

 

    vector<string> result;

 

    while(token != NULL)

    {

        result.push_back(token);

        token = strtok(NULL,delim);

    }

    return result;

}

 

std::vector<std::string> split(const std::string &s, char delim) {

    std::vector<std::string> elems;

 

    return split(s, delim, elems);

}

最后

以上就是大气未来为你收集整理的在C++中如何分隔字符串的全部内容,希望文章能够帮你解决在C++中如何分隔字符串所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部