C++ 实现 string split 的几种方法
方法1:string::find_first_of()
找到下一个token的位置,并利用substr
#include <string>
推荐使用这种方法,好用,而且灵活
void splitWithStringFind(vector<string> &ret, string str, string token)
{
// str: "One, two,, four , five,"
// token: " ,"
int cur, next = -1;
do {
cur = next + 1;
next = str.find_first_of(token, cur);
ret.push_back(str.substr(cur, next - cur));
} while (next != string::npos);
/*
"One"
""
"two"
""
""
"four"
""
""
""
"five"
""
*/
}
使用模板做一下封装,代码如下,可以直接copy使用。
// Encapsulate
struct AHaSplit {
enum empties_t {empties_ok, no_empties};
};
template <typename Container>
Container& aHaSplit(
Container& ret,
const typename Container::value_type& str,
const typename Container::value_type& token,
AHaSplit::empties_t empties = AHaSplit::no_empties)
{
ret.clear();
size_t cur;
size_t next = -1;
do
{
if (empties == AHaSplit::no_empties) {
// 找到非token字符第一个位置
next = str.find_first_not_of(token, next + 1);
if (next == string::npos) break;
next -= 1;
}
cur = next + 1;
next = str.find_first_of(token, cur);
ret.push_back(str.substr(cur, next - cur));
} while (next != Container::value_type::npos);
return ret;
}
方法2:getline
#include <sstream>
缺点是只能对单一字符划分
void splitWithGetline(vector<string> &ret, string str, char delimiter)
{
// str: "One, two,, four , five,"
// delimiter: ' '
istringstream ss(str);
while (!ss.eof()) {
string x;
getline(ss, x, delimiter);
ret.push_back(x);
}
/*
"One"
" two"
""
" four "
" five"
""
*/
}
方法3:Boost
#include <boost/algorithm/string.hpp>
需要安装好Boost
using namespace boost;
void splitWithBoost(vector<string> &ret, string str, string token)
{
// str: "One, two,, four , five,"
// token: " ,"
split(ret, str, is_any_of(token));
/*
"One"
" two"
""
" four "
" five"
""
*/
//split(ret, str, is_any_of(token), token_compress_on);
/*
"One"
"two"
"four"
"five"
""
*/
//split_regex(ret, str, regex(token));
}
方法4:strtok
C语言库函数strtok
#include<string.h>
使用strtok有很多问题,比如相邻分隔符之间看作空字段,末尾空字段省略等等,不推荐
goudan-er SHARE · CPP
C++