导读
信息学能够有助于孩子未来工作发展,提升孩子的综合能力。
字符串是我们的老朋友了,今天让我们来更加深刻认识字符串,了解字符串的重要操作,能够在以后的学习中更好地应用字符串吧!
1 字符串基本操作
字符串是我们了解比较深刻的朋友了,从第一节课我们学习输出,就了解到了字符串。
今天我们再讲字符串,就要深入讲解字符串的一些重要操作,以方便我们后续的学习。
字符串是多个字符,也就是说,在很多情况下,字符串和字符数组是不做区分的。但是字符串是一个结构,对于 这个结构,也有很多自己独特的操作。首先,我们现在复习一下之前的一些操作。
1、定义字符串
我们可以用如下方式定义字符串:
string s1;
string s2 = "AI与区块链技术";
2、字符串输入
我们有如下三种输入方式:
第一种是使用cin输入,这种输入我们最熟悉,用法比较简单,但是它会在空格和换行的位置截断。
第二种是使用gets方法,支持给字符串输入空格,会在换行位置截断。需要用到cstdio头文件。
第三种方式是使用getline方法,getline会获取一行的输入内容作为输入,第三个参数用于表示字符串终止条件,默认为回车。
对于后两种的区别:字符串输入gets适用于已知长度字符串,getline不限长度。
我们举几个例子:
使用第一种方法:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a,c;
char b[100];
cin>>a;
cout<<a<<endl;
return 0;
}
我们发现使用cin,在空格处截断了。
我们使用第二种方法:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a,c;
char b[100];
gets(b);
cout<<b<<endl;
return 0;
}
第二种方法,只能对固定长度的字符串,也就是字符数组做输入。它会获取一行的数据。
我们使用第三种方法:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a,c;
char b[100];
getline(cin, c, '#');
cout<<c<<endl;
return 0;
}
我们发现会在#处截断。
2 字符串进阶函数
接下来让我们一起来看一下更多的字符串操作吧!
1 字符串的附加
字符串支持在末尾附加其他的字符串,用到的方法是append。
我们通过示例来看一下!
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111",b = "666666";
a.append(b);
cout<<a<<endl;
return 0;
}
执行结果如下:
如果我们想附加单个字符,还可以使用push_back方法。
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111";
a.push_back('a');
cout<<a<<endl;
return 0;
}
执行结果如下:
当然,我们在之前的课程中也讲过,+=运算除了做数值的运算,也可以用于字符串的附加:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111",b = "666666";
a += b;
cout<<a<<endl;
return 0;
}
执行结果如下:
2 字符串的比较
有了字符串我们需要对字符串进行比较,字符串可以使用compare来比较字符串。这个方法会返回0或者±1:
-1表示前面的字符串小,
0表示二者相同,
1表示后面的字符串小。
比较的原则是:
从前往后比较,相等则继续往后,
某个位置上的字符小,那这个字符串就小。
举个例子:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111",b = "666666";
cout<<a.compare(b)<<endl;
cout<<a.compare(a)<<endl;
return 0;
}
执行结果如下:
3 字符串的截取
我们经常需要获得字符串的子串。我们可以通过substr来截取字符串的子串。这里的子串指的是连续的子串。
最常用的截取方式有如下两种:
s.substr(l,len) 复制串s从第l个字符开始len长度的串
s.substr(l) 复制串s到末尾
举个例子:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111666666";
cout<<a.substr(3,4)<<endl;
cout<<a.substr(3)<<endl;
return 0;
}
4 字符串的查找
我们有时候需要查找字符串中的某个元素。
如果我们想找到某个元素或子串第一次或者最后一次出现的位置,我们可以使用find和rfind方法。
我们可以通过find来获取字符串的子串(或单个字符)在字符串中第一次出现的位置,若找不到,就会返回s.end()。使用rfind进行反向查找:s.rfind(s1) 反向查找串s1在串s中第一次出现的位置。
举个例子:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111666666";
string b = "111";
cout<<a.find(b)<<endl;
cout<<a.rfind(b)<<endl;
return 0;
}
执行结果如下:
5 字符串的插入
我们经常需要在字符串中插入其他字符。主要有:
s.insert(l,s1) 将串s1插入到串s第l个字符后。
s.insert(l1,s1,l2,len) 将串s1从l2位置的字符开始len长度插入到串s第l1个字符后。
s.insert(l,c,len) 将字符数组c前len个字符插入到串s第l个字符后。
s.insert(l,len,c) 将串s第l个字符后插入len个c,c是char类型
举几个例子:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "123456789";
string b = "abc";
char c1[10] = "defghi", c2 = 'z';
a.insert(8,b);
cout<<a<<endl;
a.insert(6,b,1,2);
cout<<a<<endl;
a.insert(4,c1,3);
cout<<a<<endl;
a.insert(2,3,c2);
cout<<a<<endl;
return 0;
}
执行结果如下:
6 字符串的删除(部分删除)
我们经常需要删除某个字符串的一部分。主要有如下几种方法:
s.erase(l,len) 删除串s从索引为l开始len长度的串
s.erase(l) 删除索引为l的字符
s.erase(l,r) 删除 [l,r) 区间内的字符
注意后两个代码的参数不是整数类型,而是迭代器类型。
举个例子:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "123456789";
a.erase(8,2);
cout<<a<<endl;
a.erase(a.begin()+5);
cout<<a<<endl;
a.erase(a.begin()+1,a.begin()+3);
cout<<a<<endl;
return 0;
}
执行结果如下:
7 字符串的清空与判空
我们经常需要清空或者判断字符串是否空。我们可以通过clear将字符串清空,通过empty对字符串进行判断,空返回true,否则返回false。
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "123456789";
a.clear();
if(a.empty())
cout<<"a是空字符串"<<endl;
return 0;
}
执行结果如下:
8 、字符串的迭代器
前面我们讲到迭代器,迭代器的功能与指针类似。字符串常用的迭代器包括:
begin迭代器指向容器中第一个元素。
end迭代器指向容器最后一个元素位置后一个位置。
rbegin迭代器指向最后一个元素。
rend迭代器指向容器第一个元素位置前一个位置。
我们可以使用*和迭代器获取容器中的数据,string中的迭代器支持加法运算、减法运算、++运算和--运算:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "123456789";
cout<<*a.begin()<<endl;
cout<<*(--a.end())<<endl;
cout<<*a.rbegin()<<endl;
cout<<*(--a.rend())<<endl;
cout<<*(a.begin() + 3)<<endl;
cout<<*(a.end() - 3)<<endl;
return 0;
}
执行结果如下:
3 作业
本节课的作业,就是复习上面的所有知识,并完成下面的题目!
1 携手过关
1、题目
我们用英文字母所在位置来表示每个字母,例如1表示A和a,26表示Z和z。现在输入一串只含有大小写字母的字符串。
小明和小红两个人玩如下游戏:每个人任意组合字符串。然后计算字符串中每个字母所对应的数字和其位置(字符串索引为0的字符位置为1)的乘积的和,并将所有的和加在一起。如果两个人得到的最终数字,对17取余得到的余数一样,那就说明小明和小红携手过关。
输入输出说明:
【输入】
两行,每行一个字符串,分别表示小明和小红选择的字符串
【输出】
1或0,1表示两人携手过关,0表示两人没有携手过关
输入输出示例:
【输入】
abCde
aBCDe
【输出】
1
【输入】
abCdf
aBCDe
【输出】
0
AI与区块链技术
长按二维码关注