C++ string类型常用操作
string类型操作
字符串切割#
str.substr(索引,切割的个数) -> 返回字符串
注意:第二个参数为切割的个数
string buf = "abcdefg"; buf.substr(0, 2); // 结果为 "ab" buf.substr(1, 3); // 结果为 "bcd"
按字符切割为子字符串 #
利用sstream.h头文件和getline()函数
string s = "hello,world,!,My,name,is,C++", t; stringstream ss; ss << s; vector<string> res; while (getline(ss, t, ',')) res.push_back(t); for (auto i : res) cout << i << endl;
#
字符串输入#
使用getline读入字符串可以保留字符串中的空格
getline(cin , s1);
使用cin 在遇到空格或回车时停止
cin >> s1;
多字符串的输入,遇到空格代表当前字符串赋值完成,转到下个字符串赋值,回车停止
cin >> s2 >> s3;
字符串比较#
compare()函数 返回值为 int 类型
- 简单用法:str.compare("abc"); // str = "abc" 则返回 0
- 大小比较
- a.compare(b) > 0 则表示 a > b
- a.compare(b) < 0 则表示 a < b
cctype头文件(判断字符类型:大/小写字母、标点、数字等)#
isalnum(c) // 当是字母或数字时为真
isalpha(c) // 当是字母时为真
isdigit(c) // 当是数字是为真
islower(c) // 当是小写字母时为真
isupper(c) // 当是大写字母时为真
isspace(c) // 当是空白(空格、回车、换行、制表符等)时为真
isxdigit(c) // 当是16进制数字是为真
ispunct(c) // 当是标点符号时为真(即c不是 控制字符、数字、字母、可打印空白 中的一种)
isprint(c) // 当时可打印字符时为真(即c是空格或具有可见形式)
isgraph(c) // 当不是空格但可打印时为真
iscntrl(c) // 当是控制字符时为真
tolower(c) // 若c是大写字母,转换为小写输出,否则原样输出
搜索操作#
int index = str.find(arg) 找到arg第一次出现的位置
str.rfind() 找到arg最后一次出现的位置
如果没找到返回 -1
例如:
string buf = "abcdefg"; buf.find("cde"); // 结果为 2 buf.find("ff"); // 结果为 -1
- 找到args中任意一个字符最早\最晚出现的位置
s.find_first_of(args) // 在s中找到args中任意一个字符最早出现的位置
s.find_last_of(args) // 在s中找到args中任意一个字符最晚出现的位置
例如:
string s1 = "nice to meet you~"; cout << s1.find_first_of("mey") << endl; // 输出结果为 3,'e' 出现的最早
- 在 s 中查找 第一个/最后一个 不在 args 中的字符的位置
s.find_first_not_of(args) // 查找 s 中 第一个不在 args 中的字符的位置
s.find_last_not_of(args) // 查找 s 中 最后一个不在 args 中的字符的位置
例如:
string s1 = "nice to meet you~";
cout << s1.find_first_not_of("nop") << endl; // 输出结果为 1 ,'i' 不在 "nop" 里
类型转换(可以完成任意进制转10进制)#
- 将任意类型转换为string类型 (val可以是任何算数类型,int、double等)
string s = to_string(val)
- 将string类型转换为整型(需包含cstdio头文件)
int num1 = stoi(s, p , b) // s表示字符串,p是指针,用来保存s中第一个非数值的下标,默认为0,也可以是空指针
// b是进制数 ,将字符串作为几进制的数转换,最终结果仍然以10进制表示
//(相当于任意进制转为10进制)
还有其他几种接收类型
int num = stoi(s) // 默认10进制
long num stol(s, p, b) // 返回long型
unsigned long num stoul(s, p, b) // 返回unsigned long型
long long num stoll(s, p, b) // 返回long long型
unsigned long long num stoll(s, p, b) // 返回unsigned long long型
- 将string类型转换为浮点数
stof(s) stof(s,p) stod(s,p) stold(s,p) // 分别对应float、double、long double类型
- char型转数值函数原型 int atoi(const char *_Str) 传入参数是指针类型,所以要对字符取地址
atoi(c) // int类型
atol(c) // long类型
atoll(c) // long long类型
atof(c) // float类型
- char类型转为整数类型建议直接使用加减法转换
- 在ASCII码表中数字0~9的ASCII码值为48~57
- 直接使用int类型接收char类型的同时减去48,即可得到该数字的整数类型
char c = '9'; int num = c - 48; // num = 9
进制转换(10进制转其他)#
使用<sstream>头文件
stringstream ss;
int num = 32;
ss << hex << num;
string hexStr = ss.str();
这样就通过字符串完成了10进制到16进制的转换
其他进制:
oct 8进制
默认 就是10进制
- 进制转换配合
std::setw
和std::setfill
使用效果更佳 头文件“iomanip”- setw() 用于设置后续输出操作的最小字段宽度。这意味着,如果输出的数据少于指定的宽度,它将在数据前面填充空格,以确保字段至少有指定数量的字符宽。如果数据超过指定的宽度,它将正常输出,而不会截断数据。
- setfill() 用于设置填充字符,该字符用于填充由
std::setw
指定的字段宽度不足的部分。默认的填充字符是空格。
dec
oct
hex
ch
dec
oct
hex
ch
dec
oct
hex
ch
dec
oct
hex
ch
0
0
00
NUL
(空)32
40
20
(空格)64
100
40
@
96
140
60
`
1
1
01
SOH
(标题开始)33
41
21
!
65
101
41
A
97
141
61
a
2
2
02
STX
(正文开始)34
42
22
"
66
102
42
B
98
142
62
b
3
3
03
ETX
(正文结束)35
43
23
#
67
103
43
C
99
143
63
c
4
4
04
EOT
(传送结束)36
44
24
$
68
104
44
D
100
144
64
d
5
5
05
ENQ
(询问)37
45
25
%
69
105
45
E
101
145
65
e
6
6
06
ACK
(确认)38
46
26
&
70
106
46
F
102
146
66
f
7
7
07
BEL
(响铃)39
47
27
'
71
107
47
G
103
147
67
g
8
10
08
BS
(退格)40
50
28
(
72
110
48
H
104
150
68
h
9
11
09
HT
(横向制表)41
51
29
)
73
111
49
I
105
151
69
i
10
12
0a
LF
(换行)42
52
2a
*
74
112
4a
J
106
152
6a
j
11
13
0b
VT
(纵向制表)43
53
2b
+
75
113
4b
K
107
153
6b
k
12
14
0c
FF
(换页)44
54
2c
,
76
114
4c
L
108
154
6c
l
13
15
0d
CR
(回车)45
55
2d
-
77
115
4d
M
109
155
6d
m
14
16
0e
SO
(移出)46
56
2e
.
78
116
4e
N
110
156
6e
n
15
17
0f
SI
(移入)47
57
2f
/
79
117
4f
O
111
157
6f
o
16
20
10
DLE
(退出数据链)48
60
30
0
80
120
50
P
112
160
70
p
17
21
11
DC1
(设备控制1)49
61
31
1
81
121
51
Q
113
161
71
q
18
22
12
DC2
(设备控制2)50
62
32
2
82
122
52
R
114
162
72
r
19
23
13
DC3
(设备控制3)51
63
33
3
83
123
53
S
115
163
73
s
20
24
14
DC4
(设备控制4)52
64
34
4
84
124
54
T
116
164
74
t
21
25
15
NAK
(反确认)53
65
35
5
85
125
55
U
117
165
75
u
22
26
16
SYN
(同步空闲)54
66
36
6
86
126
56
V
118
166
76
v
23
27
17
ETB
(传输块结束)55
67
37
7
87
127
57
W
119
167
77
w
24
30
18
CAN
(取消)56
70
38
8
88
130
58
X
120
170
78
x
25
31
19
EM
(媒介结束)57
71
39
9
89
131
59
Y
121
171
79
y
26
32
1a
SUB
(替换)58
72
3a
:
90
132
5a
Z
122
172
7a
z
27
33
1b
ESC
(退出)59
73
3b
;
91
133
5b
[
123
173
7b
{
28
34
1c
FS
(文件分隔符)60
74
3c
<
92
134
5c
\
124
174
7c
|
29
35
1d
GS
(组分隔符)61
75
3d
=
93
135
5d
]
125
175
7d
}
30
36
1e
RS
(记录分隔符)62
76
3e
>
94
136
5e
^
126
176
7e
~
31
37
1f
US
(单元分隔符)63
77
3f
?
95
137
5f
_
127
177
7f
DEL
(删除)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示