Skip to content

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;

js

string s = "good good study";
string f = "student";
int p.= s. find(f);
if(p != -1){
    cout<<p;
}else{
    cout<<"no";
}
   

例2:请一句英文中的第2个单词截取出来,该英文句子中单词之间用一个空格隔开;

js
#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、作业

  1. 【基础】字符串连接
  2. 【入门】字符串出现次数

二、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函数的使用

js
#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 删除指定字符

解法一:假删除

js
#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];
        }
    }
}
   

解法二:真删除

js
#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 把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串
解法一:

js
#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函数替换

js
#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会判断为真!

js
int a = 5;
if(a){
    cout<<"yes";
}else{
    cout<<"no";
}
   

因此,不要出现下面的写法,下面的写法,if的判断永远为真!

js
int a = 0;
if(a = 5){
    cout<<"yes"<<endl;
}else{
    cout<<"no"<<endl;
}
cout<<a<<endl;
   

3.2、例题讲解

例1:is函数的使用

js
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函数的使用

js
char c;
c = 'b';
//将ascii码赋值给字符,获取编码对应的字符
c = toupper(c);
cout<<c<<endl;
   

例3: sort和reverse函数的使用

js
#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:数组逆序函数

js
reverse(a,a+n);
    for(int i = 0;i < n;i++){
        cout<<a[i]<<" ";
    }
}
   

注意:数组的本质是数组中下标为0的元素的地址;(首元素的地址)

例5:使用sort对字符串的字符进行排序!

js
string s = "jsiaszldl";
sort(s. begin(),s. end());
cout<<s;
   

例6 【入门】统计字符的个数

3.3 课堂练习

练习1 【入门】合法的变量名

练习2 【基础】重新排列

3.4、作业

  1. 【入门】字符串分离
  2. 【入门】粉碎数字
  3. 【入门】n个一位数能够组成的最大数
  4. 【入门】n个一位数能够组成的最小数

四、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

js
#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、作业练习

  1. 【入门】简单a+b
  2. 【入门】简单a*b
  3. 【基础】表达式的值(III)