C++中string的用法

串(String)是由 n(n>=0) 个字符组成的有限序列,又名字符串。通常记为 s = “a0a1a2…an-1”,其中 ai 是串中的字符,n 是串的字符个数,也是串的长度,它不包括串结束符 ‘\0’,长度为 0 的串称为空串。

串空是任意串的子串;任一串是它自身的字串。除它本身外,一个串的其他子串都是他的真子串。

C++ 有关字符串的库函数名称为 # include<string>

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
string s;  // 初始化一个空字符串  
s = "12345"; // 拷贝初始化 string s = "12345";
string ss[5]; // 初始化一个空字符串数组
string s1("123"); // 直接初始化
string s2(s1); // s2是s1的副本
string s3=s2; // s3是s2的副本
string s4(5,'a'); // s4 = "aaaaa"

char cs[]="12345";
string s5(cs,3); // 复制字符串cs的前3个字符到s5中
string s6="0123456";
string s7(s6,2); //从s6下标为2的字符开始拷贝至结束
string s8(s6,2,4); // 从s6下标2开始4个字符的拷贝,若超过s6.size只拷贝到s6尾部
string s9(s6,2,10); // s9.size = 5

cout<<s,s1...s9<<endl;
12345
123
123
123
aaaaa
123
0123456
23456
2345
23456

串处理

substr 操作

1
2
3
4
5
string s = "0123456";
// s.substr(pos,n)返回从位置为pos后面的n个字符组成的串
string s1 = s.substr(1,5); // 12345
// s.substr(pos)得到一个从pos到结尾的串
string s2 = s.substr(4); // 456

insert 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
string str = "0123456789";
string str1 = "abcd";
string str2 = "ABCDEFGHIJKLMN";
string::iterator it;
//s.insert(pos,str)在s的pos位置插入str
str.insert(6,str1); // 012345abcd6789

//s.insert(pos,str,a,n)在s的pos位置插入str中位置a到后面的n个字符
str.insert(6,str2,3,4); // 012345DEFGabcd6789

//s.insert(pos,cstr,n)//在pos位置插入cstr字符串从开始到后面的n个字符
str.insert(10,"must be string",8); // 012345DEFGmust be abcd6789

//s.insert(pos,cstr)在s的pos位置插入cstr
str.insert(10,"string "); // 012345DEFGstring must be abcd6789

//s.insert(pos,n,ch)在s.pos位置上面插入n个ch
str.insert(10,2,':'); // 012345DEFG::string must be abcd6789

//s.insert(s.it,ch)在s的it指向位置插入一个字符ch,返回新插入的位置的迭代器
it = str.insert(str.begin()+6,'-'); // 012345-DEFG::string must be abcd6789

//s.insert(s.it,n,ch)在s的it所指向位置插入n个ch
str.insert (str.end(),3,'.'); // 012345-DEFG::string must be abcd6789...

//s.insert(it,str.ita,str.itb)在it所指向的位置插入[ita,itb)的字符串
str.insert (it+1,str2.begin(),str2.begin()+3); // 012345-ABCDEFG::string must be abcd6789...

erase 操作

1
2
3
4
5
6
7
8
9
string str = "0123456789";
//s.erase(pos,n)删除pos位置开始n个字符
str.erase(3,2); // 01256789

//s.erase(s.it)删除迭代器指向的字符
str.erase(str.begin()+3); // 0126789

//s.erase(str.ita,str.itb)删除迭代器范围的字符
str.erase(str.begin()+3, str.end()-1); // 0129

append 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
string str = "0";
string str1 = "12345";
string str2 = "abcdefg";

//s.append(str)直接追加一个str的字符串
str.append(str1); // 012345

//s.append(str,pos,n)追加str中pos位置开始的n个字符
str.append(str2,4,2); // 012345ef

//s.append(cstr,n)追加字符串形参cstr的前n个字符
str.append("string",2); // 012345efst

//s.append(cstr)直接追加cstr
str.append("haha"); // 012345efsthaha

//s.append(n,ch)添加n个ch
str.append(3,'.'); // 012345efsthaha...

//s.append(str.ita,str.itb)添加str迭代器范围的字符串
str.append(str2.begin()+2,str2.end()-2); // 012345efsthaha...cde

//字符串追加也可以用重载运算符实现
str += "add"; // 012345efsthaha...cdeadd

replace 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string str = "012345678";
string str1 = "12345";
string str2 = "abcd";

//s.replace(pos,n,str)从pos位置开始n个字符被str代替
str.replace(4,3,str1); // 01231234578

//s.replace(pos1,n1,str,pos2,n2)从pos1位置开始n1个字符被str串pos2位置开始n2个字符代替
str.replace(3,5,str2,1,2); // 012bc578

//s.replace(pos,n,cstr)从pos位置开始n个字符被cstr代替
str.replace(3,4,"string"); // 012string8

//s.replace(pos,n1,cstr,n2)从pos位置开始n1个字符被cstr的前n2个字符代替
str.replace(3,5,"sample",4); // 012sampg8

//s.replace(pos,n1,n2,ch)从pos位置开始n1个字符被n2个ch字符代替
str.replace(6,2,3,'!'); // 012sam!!!8

//使用迭代器同上
str.replace(str.begin()+3,str.end()-1,str1); // 012123458
str.replace(str.begin()+3,str.end()-4,str2.begin(),str2.end()-1); // 012abc3458
str.replace(str.begin()+3,str.begin()+5,"it-str"); // 012it-strc3458
str.replace(str.begin()+4,str.begin()+8,"sample",3); // 012isamrc3458
str.replace(str.begin()+1,str.end()-4,1,'.'); // 0.3458

assign 操作

assign 操作在一起列容器当中都存在,比如 vector 等等。是一个很基本的操作函数,string 使用 assign 可以灵活的对其进行赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string str;
string str1 = "01234567";

//s.assign(str)直接把str赋值给s
str.assign(str1); // 01234567

//s.assign(str,pos,n)把str中pos位置开始的n个字符赋给s
str.assign(str1,4,3); //456

//s.assign(cstr)直接使用参数赋值
str.assign("c-string"); // c-string

//s.assign(n,ch)赋值n个ch字符
str.assign(5,'*'); // *****

//s.assign(str.ita,str.itb)指定str迭代器范围的字符串
str.assign(str1.begin()+1,str1.end()-2); // 12345

串搜索

find 和 rfind 用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//(1)size_t find (const string& str, size_t pos = 0) const;  //查找对象--string类对象
//(2)size_t find (const char* s, size_t pos = 0) const; //查找对象--字符串
//(3)size_t find (const char* s, size_t pos, size_t n) const; //查找对象--字符串的前n个字符
//(4)size_t find (char c, size_t pos = 0) const; //查找对象--字符
string str1 = "I will find you and love you.";
string str2 = "you";
size_t ff_index;
size_t lf_index;

// s.find(str)在s中查找第一个出现的str,找到则返回出现的位置,否则返回-1
ff_index = str1.find(str2); // 12
ff_index = str1.find("will"); // 2
lf_index = str1.rfind(str2); // 25
lf_index = str1.rfind("will"); // 2

// // s.find(cstr,pos,n)从s的第pos位置查找ctsr参数字符串的前n个字符
ff_index = str1.find("you are cute",13,3); // 25
lf_index = str1.rfind("you are cute",30,4); // 12

// // s,find(ch)查找第一个ch字符
ff_index = str1.find('f'); // 7
lf_index = str1.rfind('o'); // 26

find….of 用法

1
2
3
4
5
6
7
8
9
10
// find_first_of(args) 查找args中任何一个字符第一次出现的位置
// find_last_of(args) 最后一个出现的位置
// find_fist_not_of(args) 查找第一个不在args中的字符
// find_last_not_of 查找最后一个不在args中出现的字符
string str("software string find is hard.");
size_t ffo,flo,ffno,flno;
ffo = str.find_first_of("aeiou"); // 1
flo = str.find_last_of("aeiou"); // 25
ffno = str.find_first_not_of("aeiou"); // 0
flno = str.find_last_not_of("aeiou"); // 28

compare 用法

如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1。string 重载了运算符,可以直接用 >、< 和 ==来进行比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string s1="123",s2="123";
int cmp = s1.compare(s2); // 0
s1 = "223";
s2 = "1234";
cmp = s1.compare(s2); // 1
s1 = "012345";
s2 = "12345";
cmp = s1.compare(s2); // -1

//s.compare(pos,n,str)s串pos位置开始的n个字符和str比较
cmp = s1.compare(1,5,s2); // 0

//s.compare(pos1,n1,str,pos2,n2)s串pos1位置开始的n1个字符和str串pos2位置开始的n2个字符比较
cmp = s1.compare(2,3,s2,2,3); // -1 234<345
文章作者: gzwangu
文章链接: https://gzwangu.github.io/2021/10/21/C-中string的用法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Clousbin の Blog
支付宝打赏
微信打赏