因为做华为上机题的时候,经常会碰到字符串分割的问题,为了以后使用方便,所以写了一个自定义的库函数,写了三种方法,经过大量编程题的考验。
方法一
使用char作为分隔符,这种比较适用于简单的字符串分割,比如IP地址的分割,坐标的值读取
方法二
使用string作为分隔符,这时候的分隔符可以是多个字符的,这种稍微复杂一些,但是原理大致相同
方法三
使用头尾指针法(一开始使用的方法,后来觉得容易出错就常用方法一了)
源代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
/************************************************************ * 函 数 名:vector<string> Split(string str, string delim = " ") * 函数功能:分割字符串 * 函数参数:str-待分割的字符串,delim-分割串,默认空格 * 返 回 值:分割字符串 * 作 者:Elvan * 创建日期:2018-07-13 * **********************************************************/
vector<string> Split(string str, string delim = " ")
{
vector<string> res;
if (str == "")
return res;
str += delim; //方便后续操作
for (size_t i = 0; i < str.size(); i++)
{
size_t pos = str.find(delim, i);
if (pos != -1)
{
string temp = str.substr(i, pos - i);
if (temp != "")
res.push_back(temp);
i = pos + delim.size() - 1;
}
}
return res;
}
/************************************************************ * 函 数 名:vector<string> Split(string str, char delim = ' ') * 函数功能:分割字符串 * 函数参数:str-待分割的字符串,delim-分割字符,默认空格 * 返 回 值:分割字符串 * 作 者:Elvan * 创建日期:2018-07-13 * **********************************************************/
vector<string> Split(string str, char delim = ' ')
{
vector<string> res;
if (str == "")
return res;
str = str + delim; //方便后续操作
for (size_t i = 0; i < str.size(); i++)
{
size_t j = i;
for (; j < str.size(); j++)
{
if (str[j] == delim)
{
string temp = str.substr(i, j - i);
if (temp != "")
res.push_back(temp);
break;
}
}
i = j;
}
return res;
}
/************************************************************ * 函 数 名:vector<string> Split(char *str, char delim = ' ') * 函数功能:分割字符串 * 函数参数:str-待分割的字符串,delim-分割字符,默认空格 * 返 回 值:分割字符串 * 作 者:Elvan * 创建日期:2018-07-13 * **********************************************************/
vector<string> Split(char *str, char delim = ' ')
{
vector<string> res;
if (str == NULL)
return res;
char *head, *tail;
head = tail = str;
while (*head != '\0')
{
while (*head != '\0' && *head == delim)
head++;
tail = head;
while (*tail != '\0' && *tail != delim)
tail++;
res.push_back(string(head, tail));
head = tail;
}
return res;
}
int main(int argc, char const *argv[])
{
string str = "a,b,cd,1,23,#$,,^&";
vector<string> res1 = Split(str, ",");
for (size_t i = 0; i < res1.size(); i++)
cout << res1[i] << endl;
cout << "---------------" << endl;
vector<string> res2 = Split(str, ',');
for (size_t i = 0; i < res2.size(); i++)
cout << res2[i] << endl;
cout << "---------------" << endl;
char s[100] = "a,b,cd,1,23,#$,,^&";
vector<string> res3 = Split(s, ',');
for (size_t i = 0; i < res3.size(); i++)
cout << res3[i] << endl;
return 0;
}
- 运行结果
a
b
cd
1
23
#$
^&
---------------
a
b
cd
1
23
#$
^&
---------------
a
b
cd
1
23
#$
^&