//设计的string分割函数,使用一个vector存放每一个string,分割符也用一个string,对里面每个字符都可以进行分割。
//也可以用于分割字符串常量,delim参数也可以是字符串常量。
//必须包含头文件 #include<string>和#include<vector>
原理:用到string的两个成员函数find_first_of
和substr
,即先找到一个分割字符串的开头pos1和到下一个分割字符串的距离count=pos2-pos1,然后用substr获取从pos1开始的count个字符的子串就是一个分割出来的字符串。然后都存放到参数传入的vector中。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//设计的string分割函数,使用一个vector存放每一个string,分割符也用一个string,对里面每个字符都可以进行分割。
//也可以用于分割字符串常量,delim参数也可以是字符串常量。
//必须包含头文件 #include<string>和#include<vector>
void string_split(const string &str, vector<string> &v_str, const string &delim)
{
int pos1 = 0, pos2 = 0;
int len = str.length();
while (pos1 < len && pos2 != string::npos)
{
int count = 0;
pos2 = str.find_first_of(delim, pos1);
if (pos2 != string::npos)
{
if (pos1 < pos2)
{
count = pos2 - pos1;
}
}
else if (pos1<len)
{
//pos2到了最后字符串末尾
count = len - pos1;
}
if (count > 0)
{
string temp = str.substr(pos1, count);
v_str.push_back(temp);
}
pos1 = pos2 + 1;
}
}
int main()
{
//实现一个C++的字符串分割函数
string str = "aa bb cc ,dd, ee ";
string delim = " ,";
vector<string> v_str;
string_split(str, v_str, delim);
cout << "分割string字符串:" << endl;
for (string s : v_str)
{
cout << s << endl;
}
vector<string> v_str2;
string_split(".1.2aa 3bb 4cc ,5dd, 6ee ", v_str2, " ,.");
cout << "直接分割常量字符串:" << endl;
for (string s : v_str2)
{
cout << s << endl;
}
char * cstr = ",,c1 c2.c3,,c4,";
vector<string> v_str3;
string_split(cstr, v_str3, " ,.");
cout << "直接分割C风格字符串数组:" << endl;
for (string s : v_str3)
{
cout << s << endl;
}
return 0;
}