0
点赞
收藏
分享

微信扫一扫

信息学集训 | 05 字符串进阶操作

古得曼_63b6 2022-11-14 阅读 130


导读

信息学能够有助于孩子未来工作发展,提升孩子的综合能力。


字符串是我们的老朋友了,今天让我们来更加深刻认识字符串,了解字符串的重要操作,能够在以后的学习中更好地应用字符串吧!


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;
}


信息学集训 | 05 字符串进阶操作_字符串


我们发现使用cin,在空格处截断了。


我们使用第二种方法:


#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a,c;
char b[100];
gets(b);

cout<<b<<endl;
return 0;
}


信息学集训 | 05 字符串进阶操作_c++_02


第二种方法,只能对固定长度的字符串,也就是字符数组做输入。它会获取一行的数据。


我们使用第三种方法:


#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a,c;
char b[100];

getline(cin, c, '#');

cout<<c<<endl;

return 0;
}


信息学集训 | 05 字符串进阶操作_字符串_03


我们发现会在#处截断。

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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_c++_04


如果我们想附加单个字符,还可以使用push_back方法。


#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111";

a.push_back('a');

cout<<a<<endl;

return 0;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_c++_05


当然,我们在之前的课程中也讲过,+=运算除了做数值的运算,也可以用于字符串的附加


#include<cstdio>
#include<iostream>
using namespace std;
int main(){
string a = "111111",b = "666666";

a += b;

cout<<a<<endl;

return 0;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_c++_04


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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_字符串_07


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 字符串的查找

我们有时候需要查找字符串中的某个元素。


如果我们想找到某个元素或子串第一次或者最后一次出现的位置,我们可以使用findrfind方法。


我们可以通过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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_c++_08


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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_c++_09


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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_字符串_10


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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_c++_11


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;
}


执行结果如下:


信息学集训 | 05 字符串进阶操作_#include_12


3 作业

本节课的作业,就是复习上面的所有知识,并完成下面的题目!

1 携手过关

1、题目



我们用英文字母所在位置来表示每个字母,例如1表示A和a,26表示Z和z。现在输入一串只含有大小写字母的字符串。


小明和小红两个人玩如下游戏:每个人任意组合字符串。然后计算字符串中每个字母所对应的数字和其位置(字符串索引为0的字符位置为1)的乘积的和,并将所有的和加在一起。如果两个人得到的最终数字,对17取余得到的余数一样,那就说明小明和小红携手过关。


输入输出说明:


【输入】
两行,每行一个字符串,分别表示小明和小红选择的字符串
【输出】
1或0,1表示两人携手过关,0表示两人没有携手过关


输入输出示例:


【输入】
abCde
aBCDe
【输出】
1


【输入】
abCdf
aBCDe
【输出】
0


AI与区块链技术


信息学集训 | 05 字符串进阶操作_c++_13

长按二维码关注

举报

相关推荐

0 条评论