对上一篇的补充。再补充几个好用的函数

上来第一个就是重量级。C++为了兼容C语言,所以在string中,给了一个C的接口:c_str()
因为C++可能需要使用到C语言的东西,比如函数fopen等,传string格式字符串给C语言的函数,
就会报错,因为C语言只支持C格式的字符串,也就是 const char* 类型,不支持string类型。
为了解决这个问题,C++提供了c_str()函数,可将string类型的字符串转换成const char*

用法如图,c_str 是成员函数,用对象名调用即可,编译器自动使用函数底层实现转换。

如图,程序正常运行,说明c_str确实将字符串转换成了const char*类型。

这是find函数,string的成员函数。最常用的就是图中红框的第四个:
从pos位置开始正向查找字符c,找到了返回该字符索引,没找到返回npos
string filename("Test.cpp");
size_t pos = filename.find('.'); //找到‘'.' 的索引,并返回给pos
if(pos != string::npos)
{
cout<< filename[pos] <<endl; //打印pos位置的值,也就是 ‘.’
}使用例子如图。第二个参数 pos有缺省值0,所以默认是从0位置开始找
也可以从指定位置开始找,只需要改变第二个参数,比如:filename.find('.',3);
此时就会从第4个字符开始找 (3是索引)

从 pos 位置开始,拷贝 len 个长度的子字符串然后 传值返回,其中pos默认为0,len默认为npos

第一行:从索引4的位置,拷贝长度为4的子字符串,然后传值返回
第二行:从索引4的位置,拷贝到结尾(缺省值npos),然后传值返回
知道了这两个函数,我们就可以综合使用,用来查找后缀(suffix),如果只有一个 ' . '

此时会返回:.cpp
但如果,fillname中有多个 ‘ . ’ ,那么从前往后找就只能找到第一个 ‘ . ’ ,想找到后缀很困难。
此时就需要 rfind

rfind 和 find 一样,唯一的区别是:rfind 是反向查找
反向查找第一个 ‘ . ’ 就很好地解决了刚刚的问题:

此时会输出:.cpp
因为rfind的作用是反向查找,直接找到最后一个点

学会上面的几个函数,就可以来一个小应用:分段取出协议,域名地址等,不难,就是注意find后,下一次find的边界问题。

getline的作用就是可以读取一整行数据,哪怕其中有空格。 cin遇到空格就截断
所以某种意义上,getline是有用处的 getline是全局函数。


如图,分别遇到两次空格,然后截断读取,所以导致后面的无法输出。
但如果是用getline:

它保留了空格,并且继续向后读取,直到我输入了换行符。(默认换行符为终止符)
我们也可以自定义终止符:比如我用 ' g ' :

如图,换行符并不会中止读取了,而是 g ,遇到 g 时读取停止,但此时并未结束程序
此时还可以继续输入数据,但并不会读取:

需要再按一次 enter 键,才能终止程序运行。
这些函数是 全局函数。为了更灵活的比较。

其实有很多种,但是只需要讲其中一个,就能秒懂其他的,因为它们逻辑都高度相似
我们来讲 < : 比较两个C风格或者string类型的字符串,若表达式为真,则返回true(1),否则返回false(0)
重点:比较字符串比较什么?是按照ASCII 码表的值,从头开始一对一比较,相同则各自往后移动一个数据,再次进行比较,直到出结果为止

请注意:<< 运算优先级大于 < ,所以不加括号就错了(先运行:cout<<s1)。所以 对比时 尽量加上括号,不然可能会报错。
图中输出的结果是1(true),说明表达式结果正确 , 原因是 5 的ASCII 码值 小于 6.
其他的比较函数也一样