C++学习~~string(3)

1.一些函数的使用

(1)我们这个函数的用法就会体现在这个提取后缀,就是对于一个文件,我们想要知道他是什么类型的,例如下面的这个例子里面使用的test.c文件,这个文件的类型就是C类型的文件,我们想要达到的效果就是使用函数提取这个.c后缀;

我们这个地方使用的就是find函数,这个函数的参数就是这个.字符,因为这个文件的名字和文件的后缀就是使用的.这个字符作为分界线的,这个时候find函数的返回值就是.这个字符对应的下标就是4,这个时候我们定义的i的值就是4;

substr函数的作用就是提取这个字符串的一个子字符串,我们是使用的s1调用的这个函数,所以我们得到的就是s1的一个子字符串,函数的参数就是我们已经找到的.这个字符的下标,最后就可以得到这个已知字符串的后缀;

(2)但是如果这个字符串的.这个字符比较多的话,我们就没有办法find函数得到这个zip后缀了,因为这个函数得到的是第一个.后面的所有东西,这个时候我们想要得到的是zip就是最后的一个.后面的字符,这个时候我们应该使用的就是rfind函数,这个函数就可以得到这个字符串里面的最后一个.后面的后缀;

(3)对于一个网址,我们想要把这个网址的协议,域名和内容分割开来,如何解决掉?

首先这个find如果没有找到的话返回值是npos(在这个官网上面是可以查到的);

这个时候我们使用的substr提取子串,我们的这个函数是可以传递多个参数的,我们上面介绍的提取后缀是因为这个是默认从我们想要的点这个字符开始,一直到最后一个字符才结束,这个是提取部分,所以我们自己应该设置起始位置和终止位置,我们这里提取协议的话,就是从0下标开始,到这个:的下标结束;

如果想要提取的是写协议名,就要从i1+3这个位置开始,到这个com位置结束,我们的函数substr的第二个参数是子字符串的长度,就是i2-(i1+3);

对于这个最后的内容,我们从i2+1这个位置开始找就可以了,不用传递这个第二个参数,他这样就会自动找到这个字符串的末尾才会停止;

 

2.应用

(1)反转字符

 我们想要对于这个符合条件的字符进行反转,就要找到这个符合条件的字符;

首先封装一个函数,找到那些符合条件的大小写的字母,使用这个布尔值作为返回值就可以了;

接下来就是这个函数了,我们首先找到这个起始位置的下标和终止位置的下标,一个从后向前,一个从前向后进行遍历,如果前面和后面的都是大小写字母,我们就是用这个swap函数进行交换的

 

(2)字符串的最后一个单词的长度 

1.我们使用cin输入一个字符串,然后进行判断这个空格的位置,针对这个空格的位置进行有效的分割;

2.使用rfind函数找到最后的一个空格,因为这个题目要找到的是最后的一个单词的长度,所以我们这里使用的就是rfind函数,如果这个字符串有空格,我们就要使用这个size函数减去i+1;这样求的就是最后的一个单词的长度(因为这个i求的是空格的小标,i+1才是这个最后一个单词的起始位置的下标);

3.如果这个字符串本身就只有一个单词,我们直接输出这个size大小就可以了,这个时候就不会存在说这个最后一个单词了,因为这个时候这个字符串就只有一个单词;

4.这个时候运行发现是会报错的,原因就是这个 cin输入的字符串里面,str是没有办法获取这个空格的后面的字符的,比如说我们输入的是hello teanwork,这个时候str只能获取的是空格之前的字符,这个是显然不符合我们的要求的,这个时候我们就要知道getline函数用法;

5.这个函数的第一个参数是cin,第二个参数就是我们的str,这样的话就可以获取我们输入的全部的字符,而且我们是可以给这个函数添加第三个参数,这个参数就表示结束的位置;

6.如果我们的getline函数只写两个参数就代表的是获取我们输入的所有,加上第三个参数,就获取到这个参数的位置截止;下面做一个简单的对比

(1) 使用cin无法获取空格后面的内容:

(2)使用这个getline获取全部内容:
 

(3)添加第三个参数就可以到指定位置停止获取:我们这里是添加了#,这个时候读取时到#就会截止;

 

(3)字符串的相加

我们下面提供两种思路解决这个问题:

我们首先说一下这个整体的思路,就是让这个指针从后向前,直到这两个字符串都遍历完成才停止,我们定义这个next作为进位,如果相加之后的ret>10,我们就让进位是1,这个我们是使用的取模10作为这个进位的,除以10的余数新的ret,我们就让这个ret不断的进行头部插入数据,直达循环结束;

我们还需要考虑的是这个‘9’+‘1’这个时候的ret=10;next=1,ret=0,这个时候我们插入的就是ret=0,本来的话size都是1,这个时候end1=end2=0,因为只有一个字符,所以这个下标都是0,执行完之后这个end1--和end2--就小于0,最后跳出循环,这个1就被落下了,我们在循环外面需要额外的进行判断,如果这个时候的next=1的话,就要把这个next插入进去;

上面的做法是头插,时间复杂度是O(N^2),我们可以进行尾插,最后进行逆置,这样的话,时间复杂度O(N),我们这个时候尾插入,使用reverse函数进行逆置就可以了(函数参数就是头部下标和尾部下标);

头插:

 

尾插:

 

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值