C++:字符串基本操作
字符串常用基本操作
一、字符串定义、初始化
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); //将str的值复制给s
4. string s(str, strbegin, strlen); //将字符串str中从下标strbegin开始,长度位strlen的部分复制给s作为初值
5. string s(cstr, char_len); //将C_string类型(一般指字符数组)的cstr前char_len个字符串作为字符串s的初值
6. string s(str, stridx); //将字符串str中下标stridx开始到字符串结束的位置作为字符串初值
7. string s(num, ch); //生成num个ch字符组成的字符串作为字符串s的初值
【注意】:下标均是从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;
执行结果:
zhang
s: zhang
-案例2-:字符串包含空格①
string s;
cin>>s;
cout<<"s: "<<s;
执行结果:
zhang cheng
s: zhang
-案例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;
输入
5
You are Teacher Cheng
执行结果:
n: 5
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;
输入
5
You are Teacher Cheng
执行结果:
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]<<" ";
}
执行结果:
Z h a n g
(2)迭代器遍历
string str("Zhang");
string::iterator it; //创建string的迭代器
for(it=str.begin();it!=str.end();it++){
/*
① 迭代器it类似于指针,初始化为str第一个元素的迭代器
② 终止条件str.end()是指最后一个元素的下一个迭代器,并非最后一个元素的迭代器!!!
*/
cout<<*it<<" "; //it为指针,则要输出指向的值即为*it
}
执行结果:
Z h a n g
(3)新式for循环(c++11及以上)
string str("Zhang");
for(char ch:str){ //字符类型的ch依次取str里面的字符
cout<<ch<<" ";
}
执行结果:
Z h a n g
该遍历过程与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()) |
使用 |
string s="Zhang";
reverse(s.begin(),s.end());
cout<<s;
执行结果:
gnahZ
(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;
执行结果:
1111
22222222
120