6.2 string的常见函数√
发布时间:
一、 string的查找和截取
1.1、相关函数
★ find(子串substr):查找子字符串第一次出现的下标,没有返回-1;
★ find(substr,x): 在字符串的下标x之后, 查找子串substr;
★substr(开始位置i,子串长度len) : 截取子字符串,当len>字符串长度的时候,只取剩余的;
★substr(开始位置i) :截取子字符串,从下标为i 开始截取到最后;
1.2、例题讲解
例1:请求出父字符串s中首次出现子字符串s1的下标,如果s1在s中不存在,请输出 no;
string s = "good good study";
string f = "student";
int p.= s. find(f);
if(p != -1){
cout<<p;
}else{
cout<<"no";
}
例2:请一句英文中的第2个单词截取出来,该英文句子中单词之间用一个空格隔开;
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "this is a book";
//截取起始下标 =第一个空格下标+1,本题=5
//截取长度= 从第一个空格开始找第2个空格的下标
//-第一个空格的下标 =长度
int p1 = s. find(" ");
int p2 = s. find(" ",p1 + 1);
string s2 = s. substr(p1+1,p2-p1);
cout<<s2;
return 0;
}
return 0;
}
1.3 课堂练习
练习1 【入门】求子串的位置
请分别使用find及 substr函数求解该问题;
练习2 【入门】调换位置
思路:将逗号之后的单词截取(substr)出来,将逗号之前的单词截取,交换位置输出。
1.4、作业
二、string的删除、插入和替换
2.1、相关函数
★erase擦除(开始下标i,删除长度len):删除字符串第i个下标开始的len个字符;
★erase擦除(开始下标i):删除字符串第i 个下标开始往后的所有字符;
★insert(插入下标,插入字符串s):在字符串下标为 i 的位置插入一个字符串s;
★replace(i, len, str): 从下标为 i 开始, 替换 len个字符为str
2.2、例题讲解
例1: erase、insert 和replace函数的使用
#include <bits/stdc++. h>
using namespace std;
int main(){
string s = "this is a book";
// string s2 = S. substr(5,3);
// cout<<s<<endl<<s2<<endl;
s. erase(5,3);
//this a book
cout<<s<<endl;
//插入is
s. insert(5,"is ");
cout<<s<<endl;
//s:this is a book
s. replace(10,4,"student");
cout<<s<<endl;
}
例2 删除指定字符
解法一:假删除
#include <bits/stdc++. h>
using namespace std;
int main(){
string s;
char c;
cin>>s>>c;
//假删除:遍历每个字符,除了要删除的字符c以外,剩余的输出
int i;
for(i =0;i < s. size();i++){
if(s[i] != c){
cout<<s[i];
}
}
}
解法二:真删除
#include <bits/stdc++.h>
using namespace std;
int main(){
//sdf$$$sdf
//当s中含有要删除的字符c时,找到c的位置,并删除
string s;
char c;
cin>>s>>c;
int p = s. find(c);
//当s 中有 c时
while(p != -1){
//删除s中的c
s. erase(p,1);
//计算s 中是否还有c
p = s. find(c);
}
cout<<s;
}
例3 把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串
解法一:
#include <bits/stdc++. h>
using namespace std;
int main(){
//判断每个字符是否是要替换的字符
//如果是,则直接替换成新字符
string s;
char c1,c2;
cin>>s>>c1>>c2;
for(int i = 0;i < s. size();i++){
if(s[i] == c1){
s[i] = c2;
}
}
cout<<s;
}
解法二: 使用replace函数替换
#include <bits/stdc++. h>
using namespace std;
int main(){
//当s中含有字符c1时,替换为字符c2
string s;
string c1,c2;
cin>>s>>c1>>c2;
int p = s. find(c1);
while(p != -1){
s. replace(p,1,c2);
p = s. find(c1);
}
cout<<s;
}
2.3 练习
练习1 【入门】字符替换
练习2 !【入门】查找子串并替换
练习3 !!【基础】字符串编辑
三 字符类型判断/转换, 数组/string排序
3.1、相关函数
字符类型判断函数: (非 string函数)
★isalpha(c):判断c是否为字母
★islower(c):判断是否为小写
★isupper(c):判断是否为大写
★isdigit(c):判断是否为数字
说明:返回非0表示真,返回0表示假;
字符类型转换函数:(非string函数)
★tolower(c): 字符转小写
★toupper(c): 字符转大写
说明: 返回 int ;
排序和倒序函数: (非string函数)
★sort(起始地址,结束地址+1):数组升序排序
★reverse(起始地址,结束地址+1): 数组逆序
获取头尾指针
★s. begin(): 获取字符串s 的头位置 (指针)
★s.end():获取字符串s的尾位置(最后一个字符后面的位置)(指针)
注意: true打印, 结果为1, false打印结果为0
if的判断、while的判断、for的判断,除了写判断式以外,其实也可以是一个整数类型;如果整数为0,会判断为假,非0会判断为真!
int a = 5;
if(a){
cout<<"yes";
}else{
cout<<"no";
}
因此,不要出现下面的写法,下面的写法,if的判断永远为真!
int a = 0;
if(a = 5){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
cout<<a<<endl;
3.2、例题讲解
例1:is函数的使用
char c;
cin>>c;
//包含大写字母或者小写字母
//c >= 'a' && c <= 'z' | | c >= 'A' && c <= 'Z'
if(isalpha(c)){
cout<<"字母"<<endl;
if(islower(c)){
cout<<"小写"<<endl;
}else if(isupper(c)){
cout<<"大写"<<endl;
}
//c >= '0' && c <= '9'
}else if(isdigit(c)){
cout<<"数字"<<endl;
}
例2:to函数的使用
char c;
c = 'b';
//将ascii码赋值给字符,获取编码对应的字符
c = toupper(c);
cout<<c<<endl;
例3: sort和reverse函数的使用
#include <bits/stdc++. h>
using namespace std;
//辅助降序排序函数
bool cmp(int a, int b){
if(a > b){
return true;
}else{
return false;
}
}
int main(){
int a[5] = {3,2,1,5,4};
int n = 5;
sort(a,a + n);//对数组所有元素升序排序
对数组第2个数~倒数第2个数升序排序
sort(a+1,a+n-1);
sort(a,a+n, cmp);//cmp 排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排序方法是从小到大排序。
}
例4:数组逆序函数
reverse(a,a+n);
for(int i = 0;i < n;i++){
cout<<a[i]<<" ";
}
}
注意:数组的本质是数组中下标为0的元素的地址;(首元素的地址)
例5:使用sort对字符串的字符进行排序!
string s = "jsiaszldl";
sort(s. begin(),s. end());
cout<<s;
例6 【入门】统计字符的个数
3.3 课堂练习
练习1 【入门】合法的变量名
练习2 【基础】重新排列
3.4、作业
四、string和数值转换
4.1、相关函数
类型转换函数
★stoi(s):将字符串s转换为对应的整数
★stoll(s): 将字符串s转换为对应的long long
★stof(s): 将字符串s转换为对应的float
★to string(int n): 将整数n转换为字符串
★to string(double a): 将 double 型的a转为字符串, 转换成的字符串小数点后有6位
本功能需要C++11 的语法支持:
特别注意:
考 noip 的同学,请不要使用 stoi 函数 (不要使用C++11的函数), 而是改用atoi 替代, 用法案例如下:
string s = "123";
//s. c_str(): 将字符串 s转换为字符数组.
int x = atoi(s. c_str());
cout<<x + 10;
4.2、例题讲解
例1:
#include <bits/stdc++. h>
using namespace std;
int main(){
//使得devcpp支持sto函数
//工具->编译选项->勾上编译时使用以下命令
//-std=c++11
string s = "100";
int x = stoi(s);
cout<<x+1<<endl;
string s2 = "12345678912345";
long long y = stoll(s2);
cout<<y+1<<endl;
string s3 = "12.34";
float z = stof(s3);
cout<<z + 1<<endl;
int a = 10;
int b = 20;
string t1= to string(a);
string t2 = to string(b);
cout<<t1+t2<<endl;
}
4.3 课堂练习
练习1. 【基础】整数串拆段
第一步:将整数能够拆分的求和方案都拆分求和过一遍
第二步:在所有的和中找出最小的素数 第三步:判断,如果没有最小的素数,输出-1
练习2. 【基础】趣味填空
1234=127
第一步:将=左右的整数拆出来
left = 1234
right = 127
第二步:将=左侧的数字,能够组合的方案罗列
1+234
12+34
123+4
第三步:
判断罗列方案等式是否成立,成立输出等式
如果无解,输出给定的字符串
3、作业练习