前言

参考:strtok_s 函数说明

C++没有python那样的split分割函数,但string.h和string类提供了下列函数方便我们处理字符串

函数与用例

1. strtok_s

应用:将字符串按照给定字符进行分割

参数

1
2
3
4
5
6
char* strtok_s(char* str, const char* delimiters, char** next_token);
/*
第一个参数是待分割的字符串
第二个参数是指定作为分界线的字符
第三个参数是分割剩余的子字符串的存储位置
*/

xxxxxxxxxx24 1string str = “dqywy”;2cout << “转换前:” << str << endl;3transform(str.begin(), str.end(), str.begin(), toupper);4cout << “转换后:” << str << endl;5​6// 也可以定义一个新的字符串来接收,修改目标容器起始地址即可,但是字符串长度应该一致7string str = “dqywy”;8string temp = “dqywy99”;9cout << “转换前:” << str << endl;10transform(str.begin(), str.end(), temp.begin(), toupper);11cout << “转换后:” << temp << endl;12​13// 测试返回值14// 过程分析:15// 1. 目标容器temp中的dqywy被修改为DQYWY,99未被覆盖,保持不变16// 2. transform返回temp存储DQYWY后的下一个位置的迭代器,即字符9的指针17string str = “dqywy”;18string temp = “dqywy99”;19string::iterator p; // 字符串迭代器20cout << “转换前:” << str << endl;21p = transform(str.begin(), str.end(), temp.begin(), toupper);22cout << “转换后:” << temp << endl;23cout << “transform返回值解引用:” << *p << endl;24return 0;c++

注意:第二个参数是const char类型,不要忘记加const;第三个参数是二级指针,不要忘记对一级指针*取地址&

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
using namespace std;

int main()
{
char str[] = "https-dqywy-top"; // 待分割的字符串
const char delim[] = "-"; // 分割符
char* token; // 存储返回的子字符串
char *next_token = NULL; // 存储未处理的子字符串

// 获取第一个子字符串
token = strtok_s(str, delim, &next_token);

// 获取其余子字符串
while (token != NULL)
{
cout << token << endl; // 注意打印应该传token而不是*token,*token是字符,token是字符串的首地址
token = strtok_s(next_token, delim, &next_token);
}
return 0;
}

2. find

应用:查找指定子字符串的是否存在及具体位置

参数

1
2
3
4
5
size_t find(const string& str, size_t pos = 0) const;
/*
第一个参数是待查找的子字符串
第二个参数是开始匹配的位置
*/

返回值:匹配成功返回子字符串的第一个字符在整个字符串的下标;匹配失败返回string::npos (即-1)

注意:匹配失败返回的string::npos实质上就是-1

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
using namespace std;

int main()
{
string str = "https-dqywy-top";
int pos = 0; // 起始查找位置
string goal = "dqywy"; // 目标字符串

if ((pos = str.find(goal, 0)) != string::npos) // 即子字符串存在
cout << "字符串'dqywy'第一次出现的位置为:" << pos << endl;
else
cout << "字符串不存在!" << endl;

pos = 0; // 重置起始查找位置
goal = "ljywz"; //
if ((pos = str.find(goal, 0)) != string::npos) // 即子字符串存在
cout << "字符串'ljywz'第一次出现的位置为:" << pos << endl;
else
cout << "字符串不存在!" << endl;
return 0;
}

3. substr

应用:获取从指定的起始位置开始,长度为n的子字符串

参数

1
2
3
4
5
string substr(size_t pos = 0, size_t n = npos) const;
/*
第一个参数是起始位置
第二个参数是截取的子字符串的长度
*/

返回值:子字符串

注意:起始位置从0开始计算

实例:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
using namespace std;

int main()
{
string str = "https-dqywy-top";
string sub_str; // 截取字符串
sub_str = str.substr(6, 5);
cout << sub_str << endl;
return 0;
}