字符串常用基本操作
一、字符串定义、初始化
1.定义
(1)使用字符数组char str[10];
(2)使用"string"类定义一个字符串string str;
【注意】:使用"string"类定义字符串需加头文件<string>
或万能头
string与字符数组的区别:
- string
C++中的类,包含了大量的成员函数,可以进行快捷的操作,类型为string
,不以'\0'
结束
- 字符数组
C语言中的字符串表示,用char数组实现,类型为const char *
,字符串以'\0'
结尾
2.初始化
(1)使用字符数组char s1[]="I am Teacher Zhang";
(2)使用"string"——构造函数
| 1. string str; |
| 2. string str=""; |
| |
| 3. string s(str); |
| |
| 4. string s(str, strbegin, strlen); |
| |
| 5. string s(cstr, char_len); |
| |
| 6. string s(str, stridx); |
| |
| 7. string s(num, ch); |
【注意】:下标均是从0开始
| #include<iostream> |
| #include<string> |
| using namespace std; |
| |
| int main(){ |
| char cstr[]="I am Teacher Zhang"; |
| string str="You are Teacher Cheng"; |
| |
| string s1; |
| string s2=""; |
| string s3(str); |
| string s4(str,2,7); |
| string s5(cstr,7); |
| string s6(str,7); |
| string s7(7,'z'); |
| cout<<"s1: "<<s1<<endl; |
| cout<<"s2: "<<s2<<endl; |
| cout<<"s3: "<<s3<<endl; |
| cout<<"s4: "<<s4<<endl; |
| cout<<"s5: "<<s5<<endl; |
| cout<<"s6: "<<s6<<endl; |
| cout<<"s7: "<<s7<<endl; |
| } |
运行结果:

二、字符串输入、输出
1.字符数组的输入、输出
通常使用scanf()
和printf()
格式控制使用"%s"。也可以使用cin和cout。
| char cstr[10]; //定义字符数组 |
| scanf("%s",cstr); //输入字符串,此处"cstr"即为地址,则可不用"&cstr" |
| printf("%s",cstr); //输出字符串 |
| |
| cin>>cstr; |
| cout<<cstr; |
2.string类型字符串输入、输出
(1)cin
输入字符串,但遇到空格会停止接收字符。若输入的字符串中不含空格、回车则直接使用,如果包含则使用方法②。
-案例1-:基础格式
| string s; |
| cin>>s; |
| cout<<"s: "<<s; |
| |
执行结果:
-案例2-:字符串包含空格①
| string s; |
| cin>>s; |
| cout<<"s: "<<s; |
| |
执行结果:
-案例3-:字符串包含空格②
| string s1,s2 |
| cin>>s1 |
| cin>>s2 |
| cout<<"s1: "<<s1<<endl |
| cout<<"s2: "<<s2 |
执行结果:
| zhang cheng |
| s1: zhang |
| s2: cheng |
-案例4-:输入一行字符串("单词"+"空格"构成),获取其中的单词
| |
| for(string s;cin>>s;){ |
| cout<<s<<" "; |
| } |
执行结果:
| I am Teacher Zhang |
| I am Teacher Zhang |
(2)getline
输入,接收整行输入的字符串。遇到换行符停止接收字符。语法:getline(cin,str);
-案例1-:基础格式①
| string s; |
| getline(cin,s); |
| cout<<"s: "<<s; |
| |
执行结果:
| I am Teacher Zhang |
| s: I am Teacher Zhang |
-案例2-:基础格式②
| string s1,s2 |
| getline(cin,s1) |
| getline(cin,s2) |
| cout<<"s1: "<<s1<<endl |
| cout<<"s2: "<<s2 |
执行结果:
| I am Teacher Zhang |
| You are Teacher Cheng |
| s1: I am Teacher Zhang |
| s2: You are Teacher Cheng |
-案例3-:cin、getline混合使用的多行输入(第一行输入一个整数,第二行输入一行带空格的字符串)
| int n; |
| string s; |
| cin>>n; |
| getline(cin,s); |
| cout<<"n: "<<n<<endl; |
| cout<<"s: "<<s; |
输入
执行结果:
执行结果s为空串,原因是cin
输入遇到换行符或空格停止,在输入'5'后回车(换行符),cin
截断,getline
读入换行符,也停止接收字符,因此s为空串。
解决方法为:多写一个getline或者使用getchar()来接收多余的换行符
| int n; |
| string s; |
| cin>>n; |
| getchar(); |
| getline(cin,s); |
| cout<<"n: "<<n<<endl; |
| cout<<"s: "<<s; |
输入
执行结果:
| n: 5 |
| s: You are Teacher Cheng |
三、string类字符串遍历
(1)常规方法——下标遍历(使用str.size()
获取字符串长度)
| string str="Zhang"; |
| for(int i=0;i<str.size();i++){ |
| cout<<str[i]<<" "; |
| } |
执行结果:
(2)迭代器遍历
| string str("Zhang"); |
| string::iterator it; |
| for(it=str.begin();it!=str.end();it++){ |
| |
| |
| |
| |
| cout<<*it<<" "; |
| } |
执行结果:
(3)新式for循环(c++11及以上)
| string str("Zhang") |
| for(char ch:str){ //字符类型的ch依次取str里面的字符 |
| cout<<ch<<" " |
| } |
执行结果:
该遍历过程与Python中for ch in str
过程相似。
四、string类字符串常用操作(成员函数)
1.string字符串特性
与字符数组不同,string不可通过下标对元素进行赋值更新,需要使用“拼接”或“替换”的操作。
典例:将string a中的一个子串里每一个字符单独赋值给string b的相应位置,然后输出b。使用字符数组的操作a[i++]=b[j++]
是错误的。
2.获取字符串长度
方法 |
含义 |
使用 |
str.size() 或str.length() |
返回string对象的字符个数,二者执行效果相同 |
string str("Zhang"); int len=str.size(); |
3.增——插入
方法 |
含义 |
注意事项 |
str.push_back(ch) |
在字符串str末尾插入字符 |
只可插入字符。'1'√ "1" × |
str.insert(pos,str1) |
在字符串str的pos位置插入字符串str1 |
只可插入字符串。"1"√ '1' × |
str.insert(pos,num,ch) |
在字符串str的pos位置插入num个字符ch |
只可插入字符。'1'√ "1" × |
str.insert(pos,str1,idx,num) |
在字符串str的pos位置插入字符串str1中从idx位置开始后面的num个字符 |
下标开始位置为0 |
| string s="Cheng" |
| string str1("Zhang"); |
| str1.push_back('i'); //末尾插入字符'i',不可为"i" |
| cout<<"str1: "<<str1<<endl; |
| |
| string str2(s); |
| str2.insert(4,"i"); //插入字符串"i",不可为'i' |
| cout<<"str2: "<<str2<<endl; |
| |
| string str3(s); |
| str3.insert(4,2,'i'); //插入字符'i',不可为"i" |
| cout<<"str3: "<<str3<<endl; |
| |
| string str4(s); |
| str4.insert(2,str1,1,5); |
| cout<<"str4: "<<str4<<endl; |
执行结果:
| str1: Zhangi |
| str2: Chenig |
| str3: Cheniig |
| str4: Chhangieng |
4.增——拼接
方法 |
含义 |
+ 操作符 |
将两个字符串直接拼接 |
str.append(s) |
将字符串s拼接在str后面 |
str.append(s,begin,end) |
将字符串s从begin到end位置的子串拼接在str后面 |
str.append(len,ch) |
将len个字符ch拼接在str后面 |
| string s1="Cheng"; |
| string s2="Zhang"; |
| |
| cout<<"s1+s2: "<<s1+s2<<endl; |
| |
| string str1(s1); |
| str1.append(s2); |
| cout<<"str1: "<<str1<<endl; |
| |
| string str2(s1); |
| str2.append(s2,2,4); |
| cout<<"str2: "<<str2<<endl; |
| |
| string str3(s1); |
| str3.append(3,'A'); |
| cout<<"str3: "<<str3<<endl; |
执行结果:
| s1+s2: ChengZhang |
| str1: ChengZhang |
| str2: Chengang |
| str3: ChengAAA |
5.删
方法 |
含义 |
str.pop_back() |
删除字符串str最后一个字符 |
str.erase(start,end) |
将字符串s下标start到下标end的字符删除 |
str.erase(iterator p) |
删除字符串中p所指的字符,p为str的迭代器 |
str.erase(iterator b,iterator e) |
删除字符串中b到e所指的字符,b和e为str的迭代器 |
| string s1="Cheng"; |
| string s2="Zhang"; |
| |
| string str1(s1); |
| str1.pop_back(); |
| cout<<"str1: "<<str1<<endl; |
| |
| string str2(s1); |
| str2.erase(1,3); |
| cout<<"str2: "<<str2<<endl; |
| |
| string str3(s1); |
| str3.erase(str3.begin()+3); //str.begin()即为迭代器,指向字符'C',+3后指向'n'。必须为str3.begin()。 |
| cout<<"str3: "<<str3<<endl; |
| |
| string str4(s1); |
| str4.erase(str4.begin()+1, str4.end()-1); //删除str4下标区间为[str4.begin()+1,str4.end()-1]的子串。必须为str4.begin()、str4.end()。 |
| cout<<"str4: "<<str4<<endl; |
执行结果:
| str1: Chen |
| str2: Cg |
| str3: Cheg |
| str4: Cg |
6.改——替换
方法 |
含义 |
str.replace(pos,n,s) |
把字符串str从索引pos开始的n个字符替换为字符串s |
str.replace(pos,n,m,ch) |
把字符串str从索引pos开始的n个字符替换为m个字符ch |
| string s1="Cheng"; |
| string s2="Zhang"; |
| |
| string str1(s1); |
| str1.replace(1,3,"HHHHH"); |
| cout<<"str1: "<<str1<<endl; |
| |
| string str2(s1); |
| str2.replace(1,3,7,'Y'); |
| cout<<"str2: "<<str2<<endl; |
| |
| |
| string str3(s1); |
| str3.replace(0,1,1,'Z'); |
| cout<<"str3: "<<str3<<endl; |
执行结果:
| str1: CHHHHHg |
| str2: CYYYYYYYg |
| str3: Zheng |
7.查——查找
方法 |
含义 |
str.find(s) |
查找字符串或字符s在字符串str中第一次出现的位置,返回找到的位置索引,-1表示查找不到 |
str.find(s,pos) |
查找字符串或字符s在字符串str[pos,str.size()-1]中第一次出现的位置,返回找到的位置索引,-1表示查找不到 |
str.rfind(s) |
查找字符串或字符s在字符串str中最后一次出现的位置(反向查找),返回找到的位置索引,-1表示查找不到 |
str.find(s,pos) |
查找字符串或字符s在字符串str[0,pos]中最后一次出现的位置,返回找到的位置索引,-1表示查找不到 |
| string str="I am Teacher Zhang"; |
| int n; |
| |
| n=str.find("a"); |
| cout<<"a-pos: "<<n<<endl; |
| |
| n=str.find("a",6); |
| cout<<"a-pos: "<<n<<endl; |
| |
| n=str.rfind("a"); |
| cout<<"a-pos: "<<n<<endl; |
| |
| n=str.rfind("a",5); |
| cout<<"a-pos: "<<n<<endl; |
| |
| n=str.find("ch",7); |
| cout<<"ch-pos: "<<n<<endl; |
| |
| n=str.rfind("ch",6); |
| cout<<"ch-pos: "<<n<<endl; |
| |
执行结果:
| a-pos: 2 |
| a-pos: 7 |
| a-pos: 15 |
| a-pos: 2 |
| ch-pos: 8 |
| ch-pos: -1 |
8.其他函数
(1)反转
方法 |
含义 |
reverse(str.begin(),str.end()) |
使用中的reverse函数将str反转 |
| string s="Zhang"; |
| reverse(s.begin(),s.end()); |
| cout<<s; |
执行结果:
(2)判断空串
方法 |
含义 |
str.empty() |
判断str是否为空,为空返回1,不为空返回0 |
(3)截取子串
方法 |
含义 |
str.substr(pos) |
得到字符串str从pos到结尾的子串 |
str.substr(pos,n) |
得到字符串str位置为pos后面的n个字符组成的子串 |
| string s="I am Teacher Zhang"; |
| string s1=s.substr(5); |
| string s2=s.substr(5,7); |
| cout<<"s1: "<<s1<<endl; |
| cout<<"s2: "<<s2<<endl; |
执行结果:
| s1: Teacher Zhang |
| s2: Teacher |
(4)数字转换字符串
方法 |
含义 |
注意 |
to_string() |
将基本类型的值转换为字符串 |
char类型的转换是转换成它的ASCII值,而不是字符 |
| string s; |
| int a=1111; |
| long long b=22222222; |
| char c='x'; |
| s=to_string(a); |
| cout<<s<<endl; |
| s=to_string(b); |
| cout<<s<<endl; |
| //将转换成ASCII值120 |
| s=to_string(c); |
| cout<<s<<endl; |
| |
执行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)