用C ++分割字符串

时间:2008-11-09 00:16:28

标签: c++ string token

如何在C ++中将字符串拆分为标记?

6 个答案:

答案 0 :(得分:14)

这对我很有用:),它将结果放在elems中。 delim可以是char

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;
}

答案 1 :(得分:5)

this Mingw distro包含Boost:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <ostream>
#include <algorithm>
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;

int main() {
    vector<string> v;
    split(v, "1=2&3=4&5=6", is_any_of("=&"));
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));
}

答案 2 :(得分:4)

您可以使用C函数strtok

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

Boost Tokenizer也可以完成这项工作:

#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>

int main(){
   using namespace std;
   using namespace boost;
   string s = "This is,  a test";
   tokenizer<> tok(s);
   for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout << *beg << "\n";
   }
}

答案 3 :(得分:3)

尝试使用stringstream:

std::string   line("A line of tokens");
std::stringstream lineStream(line);

std::string token;
while(lineStream >> token)
{
}

查看我对你上一个问题的回答:
C++ Reading file Tokens

答案 4 :(得分:3)

另请参阅String Algo library

中的boost :: split
string str1("hello abc-*-ABC-*-aBc goodbye");
vector<string> tokens;
boost::split(tokens, str1, boost::is_any_of("-*")); 
// tokens == { "hello abc","ABC","aBc goodbye" }

答案 5 :(得分:1)

这取决于令牌分隔符的复杂程度以及是否有多个。对于简单的问题,只需使用std :: istringstream和std :: getline。对于更复杂的任务,或者如果您想以符合STL的方式迭代令牌,请使用Boost的Tokenizer。另一种可能性(虽然比这两者中的任何一个更混乱)是设置一个调用std :: string :: find的while循环,并将最后找到的标记的位置更新为搜索下一个标记的起点。但这可能是3个选项中最容易出错的。