如何在C ++中将字符串拆分为标记?
答案 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 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个选项中最容易出错的。