字符串和string类

Posted by Felix Zhang on 2020-05-21
Words 1.2k and Reading Time 5 Minutes
Viewed Times

字符串和string类

C风格字符串

使用“ ”结尾的一维字符型数组,最终所需要的空间比字符串中字符个数多一个;

1
2
3
4
5
6
7
8
9
10
11
12
13
//C++中的一些操作
strcpy(s1, s2);
//复制字符串s2到s1
strcat(s1, s2);
//连接字符串s2到s1的末尾
strlen(s1);
//返回字符串s1的长度
strcmp(s1, s2);
//比较两个字符串,若相同则返回0;如果s1大,则返回值大于0,否则小于0;
strchr(s1, ch);
//返回一个指针,指向s1中ch字符第一次出现的位置
strstr(s1, s2);
//返回一个指针,指向s1中s2第一次出现的位置

C++标准库中的string类

优势:可以看作基本数据类型使用,操作较char型字符串更加方便

1.声明一个string类型变量

1
2
string s;
string ss[10];//声明一个string类型的数组

2.初始化

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
#include <bits/stdc++.h>
using namespace std;

int main()
{
ios::sync_with_stdio(false);
string s;//默认初始化,一个空字符串
string s1("ssss");//s1是字面值“ssss”的副本
string s2(s1);//s2是s1的副本
string s3=s2;//s3是s2的副本
string s4(10,'c');//把s4初始化
string s5="hiya";//拷贝初始化
string s6=string(10,'c');//拷贝初始化,生成一个初始化好的对象,拷贝给s6

//string s(cp,n)
char cs[]="12345";
string s7(cs,3);//复制c风格字符串cs的前3个字符到s当中

//string s(s2,pos2)
string s8="asac";
string s9(s8,2);//从s2的第二个字符开始拷贝,不能超过s2的size

//string s(s2,pos2,len2)
string s10="qweqweqweq";
string s11(s10,3,4);//s4是s3从下标3开始4个字符的拷贝,超过s3.size出现未定义
return 0;
}

3.字符串的处理方法

substr
1
2
s.substr(pos, len);//返回从pos开始往后长度为len的字符串
s.substr(pos);//从pos开始剩下的所有字符串

如输入的位置超过限制,则会报错

insert
1
2
3
4
5
6
7
8
s.insert(pos, str);//在pos位置放入一个字符串str
s.insert(pos, str, a, n);//在pos位置插入str中a位置往后n个字符
s.insert(pos, cstr, n);//在pos位置插入c风格字符串从开始到末尾的n个字符
s.insert(pos, cstr);//在pos位置插入cstr字符串
s.insert(pos, n, ch);//在pos位置上插入n个ch字符
s.insert(s.it, ch);//在s的it指向位置前面插入一个字符ch,返回新插入的位置的迭代器
s.insert(s.it,n,ch);//在s的it所指向位置的前面插入n个ch
s.insert(it, str.ita, str.itb);//在it所指向的位置的前面插入[ita,itb)的字符串
erase
1
2
3
s.erase (10,8);//直接指定删除的字符串位置第十个后面的8个字符
s.erase (str.begin()+9);//删除迭代器指向的字符
str.erase (str.begin()+5, str.end()-9); //删除迭代器范围内的字符
append
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//直接追加一个str2的字符串
str.append(str2);
//后面追加str3第6个字符开始的3个字符串
str.append(str3,6,3);
//追加字符串形参的前5个字符
str.append("dots are cool",5);
//直接添加
str.append("here: ");
//添加10个'.'
str.append(10u,'.');
//添加str3迭代器范围的字符串
str.append(str3.begin()+8,str3.end());
//最后这个比较特殊,意思是添加5个'A',实际上参数里面的65对应的asc码就是65
str.append<int>(5,65);
//字符串追加也可以用重载运算符实现
str+="lalala";
replace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//使用下标
//第9个字符以及后面的4个字符被str2代替
str.replace(9,5,str2); // "this is an example string." (1)
//第19个字符串以及后面的5个字符用str的第7个字符以及后面的5个字符代替
str.replace(19,6,str3,7,6); // "this is an example phrase." (2)
//第8个字符以及后面的9个字符用字符串参数代替
str.replace(8,10,"just a"); // "this is just a phrase." (3)
//第8个字符以及后面的5个字符用字符串参数的前7个字符替换
str.replace(8,6,"a shorty",7); // "this is a short phrase." (4)
//第22以及后面的0个字符用3个叹号替换
str.replace(22,1,3,'!'); // "this is a short phrase!!!" (5)

// 使用迭代器
str.replace(str.begin(),str.end()-3,str3); // "sample phrase!!!" (1)
str.replace(str.begin(),str.begin()+6,"replace"); // "replace phrase!!!" (3)
str.replace(str.begin()+8,str.begin()+14,"is coolness",7); // "replace is cool!!!" (4)
str.replace(str.begin()+12,str.end()-4,4,'o'); // "replace is cooool!!!" (5)
str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// "replace is useful." (6)
assign
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//直接把base赋值给str
str.assign(base);
//把base第10个字符以及后面的8个字符赋给str
str.assign(base,10,9);
//把参数中的0到6个字符串赋给str
str.assign("pangrams are cool",7);
//直接使用参数赋值
str.assign("c-string");
//给str赋值10个'*'字符
str.assign(10,'*');
//赋值是10个'-'
str.assign<int>(10,0x2D);
//指定base迭代器范围的字符串
str.assign(base.begin()+16,base.end()-12);

4.搜索操作

find
rfind
find_…_of
5.比较和转换

This is copyright.