目录
字符串认识
1.字符串变量string s;
字符串变量是一个一个字符变量连起来,末尾以\0结尾。每一个字符变量叫做字符串变量的元素,即s[i];
2.字符串的长度:
(1).获取长度:s.size();或s.length();
(2).字符串元素s[i]的下标范围:0~s.size()-1;
3.字符串s输入:
(1)没有空格: cin>>s;
(2)有空格: getline(cin,s);
getline(cin,s,'#'); //自定义输入结束符号为#号
(3)getchar()获取一个字符;
如果使用cin,再使用getline(cin,s);,需要中间添加getchar()消耗掉cin后的换行符号;
4.翻转字符串s:
reverse(s.begin(),s.end());
5.统计s中字母s[]的个数:
count(s.begin(),s.end(),s[i]);
例题:字符串倒序输出
描述:
给定一个字符串,然后将字符串倒序输出。
输入描述:
输入一个字符串 S(2<strlen(S)<100)
输出描述:
将字符串S倒序输出。
用例输入:
reverse
用例输出:
esrever
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
reverse(s.begin(),s.end());
cout<<s;
return 0;
}
字符串查找函数
1.查找字符串s中的第一个子串s1:
int pos=s.find(s1);
2.从下标a开始查找字符串s中的第一个子串s1:
int pos=s.find(s1, a);
3.查找字符串s中的最后一个子串s1:
int pos=s.rfind(s1);
若字符串s中有子串s1,返回值为子串s1的位置,否则返回值为"-1";
例题:统计字符个数
描述:
编程统计输入句子中出现“lanqiao”字样的个数。(注意,“lanqiao”字样可以是不同大小写字母的组合,例如:LanQIAO、LanQiao 等)
输入描述:
输入一个字符串(0≤字符串长度≤100)。
输出描述:
输出该字符串中“lanqiao”字样出现的次数。(注意:“lanqiao”字样可以是不同大小写字母的组合)
用例输入:
Lanqiaoqingshao, lanqiaojingsai, Lanqiaoceping.
用例输出:
3
#include<bits/stdc++.h>
using namespace std;
int main(){
int cnt=0;
string s;
getline(cin,s);
for(int i=0;i<s.size();i++)
s[i]=tolower(s[i]);
int pos=s.find("lanqiao");
while(pos!=-1){
cnt++;
pos=s.find("lanqiao",pos+1);
}
cout<<cnt<<endl;
return 0;
}
字符串截取函数
从字符串s的下标i截取长度为len的一个子串s1:
string s1=s.substr(i,len);
例题:删除单词后缀
描述:
给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(题目保证删除后缀后的单词长度不为0), 否则不进行任何操作。
输入描述:
输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为32)。
输出描述:
输出按照题目要求处理后的单词。
用例输入:
referer
用例输出:
refer
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int len=s.size();
if(s=="er"||s=="ly"||s=="ing")
cout<<s<<endl;
else if(s.rfind("ing")==len-3)
cout<<s.substr(0,len-3)<<endl;
else if(s.rfind("er")==len-2||s.rfind("ly")==len-2)
cout<<s.substr(0,len-2)<<endl;
else
cout<<s<<endl;
return 0;
}
字符串比较函数
比较两个字符串s1,s2的大小:
int a=s1.compare(s2);
compare()函数返回一个整数值,表示两个字符串的相对顺序;
如果s1<s2,返回值为-1;如果s1=s2,返回值为0;如果s1>s2,返回值为1;
字符串插入函数
将子串s1插入到字符串s,i表示插入的下标位置,s1表示要插入的子串:
s.insert(i, s1);
例题:墓碑上的字符
描述:
考古学家发现了一座千年古墓,墓碑上有神秘的字符。经过仔细研究,发现原来这是开启古墓入口的方法。 墓碑上有2行字符串,其中第一个串的长度为偶数,现在要求把第2个串插入到第一个串的正中央,如此便能开启墓碑进入墓中。
输入描述:
输入数据首先给出一个整数n,表示测试数据的组数。 然后是n组数据,每组数据2行,每行一个字符串,长度大于0,小于50,并且第一个串的长度必为偶数。
输出描述:
请为每组数据输出一个能开启古墓的字符串,每组输出占一行。
用例输入: 用例输出:2 HELLOWORLD HELRLD WLHCLUB LOWO WB LHCLU
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
string s1,s2;
cin>>s1>>s2;
int pos=s1.size()/2;
s1.insert(pos,s2);
cout<<s1<<endl;
}
return 0;
}
字符串删除函数
从字符串s的下标i删除长度为len的子串:
s.erase(i,len);
例题:删除指定子串
描述:
输入两个字符串s1和s2,确保s2长度小于s1,如果s1中有一段子串与s2相同,则删除该段子串并输出,如果没有,则输出s1;
用例输入1: 用例输出1:I am a student I am a ent stud用例输入2: 用例输出2:
you are a teacher you are a teacher am
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
getline(cin,s1);
getline(cin,s2);
int pos=s1.find(s2);
if(pos!=-1){
int len=s2.size();
s1.erase(pos,len);
}
cout<<s1<<endl;
return 0;
}
字符串替换函数
将字符串s中的子串s1替换为s2:
调用替换方法(先找到s1的位置,再测量s1的长度,替换为s2)
s.replace(s.find(s1),s1.size(),s2);
例题:查找子串并替换
描述:
对输入的一句子实现查找且置换的功能(找到某个子串并换成另一子串)。
比如:将“abcf abdabc”中的“abc”,替换为“AA”,则替换结果为“AAf abdAA”,而将“abcf abdabc”中的“abc”替换为“abcabc”,则替换结果为“abcabcf abdabcabc”。本题查找子串时注意,大小写完全一致,才能作为子串,比如:在“Abcf abd Abc”中,如果找字符串“abc”是不存在的。
注意,三个字符串中可能都存在空格。第一个字符串的长度最大为10^8
输入描述:
第一行为原来的字符串;
第二行为要查找的子串;
第三行为要替换成的子串。
输出描述:
只有一行,为替换好的字符串
用例输入: 用例输出:abcf abdabc AAf abdAA abc AA
#include<bits/stdc++.h>
using namespace std;
int main(){
string s,s1,s2;
getline(cin,s);
getline(cin,s1);
getline(cin,s2);
int pos=s.find(s1);
while(pos!=-1){
s.replace(pos,s1.size(),s2);
pos=s.find(s1,pos+s2.size());
}
cout<<s<<endl;
return 0;
}