一、使用strtok分割字符数组:
1、strtok函数原型:
char * strtok (char * str, const char * delimiters);
①、参数str指向要分割的字符串,参数delimiters则为分割依据。当发现分割字符时,将该字符改为'\0'字符。
②、在第一次调用时,strtok()需给出参数str字符串,将字符串转换成标记。
③、往后的调用则将参数str设置成NULL。
④、每次调用成功则返回下一个分割后的字符串指针。 如果已无从分割则返回NULL。
⑤、只能以单个字符最为分割依据(可以有多个依据)。
2、代码:
//借助strtok实现split
#include<iostream>
#include <cstring>
using namespace std;
int main()
{
char s[] = "Hello Nice, to meet ,* you";
/*
** 用 空格,星号,逗号进行分割
** 无论多少个,都会被当作一个key
*/
const char* d = " *,"; //分割依据
char *p; //保存每次分割结果
p = strtok(s,d);
while(p)
{
cout<<p<<endl;
p=strtok(NULL,d);
}
return 0;
}
3、结果:
- 加深理解:
#include<iostream>
#include <cstring>
using namespace std;
int main()
{
char s[] = "Hello Nice, to meet ,* you";
const char* d = " *,"; //分割依据
char *p; //保存每次分割结果
//第一次调用需参数s
p = strtok(s,d);
cout<<p<<endl;
//后面的调用,参数为NULL
p=strtok(NULL,d);
cout<<p<<endl;
return 0;
}
二、利用find函数与substr函数,实现分割字符串:
1、两个基本函数:
①、find函数用法一:
1)两个参数:
size_type find( const basic_string &str, size_type index );
str:寻找依据,即要寻找什么;
index:从哪里开始寻找。
2)一个参数:
一个参数,默认从第一个字符开始寻找。
3)未找到则返回string::npos;
②、substr函数用法:
basic_string substr( size_type index, size_type num = npos );
index:子串起始位置;
num:子串长度。
2、代码:
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
/*
*str:要分割的字符串
*pattern:分割依据
*result:分割结果
*/
//const保证不改变原串,&不用创建新的字符串
vector<string> splitString(const string& str,const string& pattern)
{
vector<string> result;
//string::size_type类型,left:左边界位置 right:右边界位置
string::size_type left, right;
right = str.find(pattern);
left = 0;
while(right != string::npos)
{
//以免字符串首部就是分割依据,压入长度为0的字符串
if(right-left)
{
//压入起始位置为left,长度为(right-left)的字符串
result.push_back(str.substr(left, right-left));
}
left = right + pattern.size(); //右边界右移分割依据的长度,作为新的左边界
right = str.find(pattern, left); //从left这个位置开始find
}
//退出循环时,左边界不是最后一个元素
if(left != str.length())
{
result.push_back(str.substr(left));
}
return result;
}
int main()
{
string arrA="cd ab cdcdefcdm ncd";
string arrB="cd";
vector<string> res=splitString(arrA,arrB);
int len=res.size();
for(int i=0;i<len;i++)
{
cout<<res[i]<<" ";
}
cout<<"END";
return 0;
}
3、结果: