C++string中用于查找的find系列函数浅析

作者:网络    软件教程库   2020-05-13

总述:
以下所讲的所有的string查找函数,都有唯一的返回类型,那就是size_type,即一个无符号整数(按打印出来的算)。若查找成功,返回按查找规则找到的第一个字符或子串的位置;若查找失败,返回npos,即-1(打印出来为4294967295)。

1.fine()

原型:

//string (1)
size_type find (const basic_string str, size_type pos = 0) const noexcept;
//c-string (2)
size_type find (const chart* s, size_type pos = 0) const;
//buffer (3)
size_type find (const chart* s, size_type pos, size_type n) const;
//character (4)
size_type find (chart c, size_type pos = 0) const noexcept;

示例:

#includeiostream
#includestring

using namespace std;

int main()
{
    //测试size_type find (chart c, size_type pos = 0) const noexcept;
    string st1("babbabab");
    cout  st1.find(‘a‘)  endl;//1   由原型知,若省略第2个参数,则默认从位置0(即第1个字符)起开始查找
    cout  st1.find(‘a‘, 0)  endl;//1
    cout  st1.find(‘a‘, 1)  endl;//1   
    cout  st1.find(‘a‘, 2)  endl;//4   在st1中,从位置2(b,包括位置2)开始,查找字符a,返回首次匹配的位置,若匹配失败,返回npos
    cout  st1.rfind(‘a‘,7)  endl;//6   关于rfind,后面讲述
    cout  st1.find(‘c‘, 0)  endl;//4294967295
    cout  (st1.find(‘c‘, 0) == -1)  endl;//1
    cout  (st1.find(‘c‘, 0) == 4294967295)  endl;//1   两句均输出1,原因是计算机中-1和4294967295都表示为32个1(二进制)
    cout  st1.find(‘a‘, 100)  endl;//4294967295   当查找的起始位置超出字符串长度时,按查找失败处理,返回npos
    //测试size_type find (const basic_string str, size_type pos = 0) const noexcept;
    string st2("aabcbcabcbabcc");
    string str1("abc");
    cout  st2.find(str1, 2)  endl;//6   从st2的位置2(b)开始匹配,返回第一次成功匹配时匹配的串(abc)的首字符在st2中的位置,失败返回npos
    //测试size_type find (const chart* s, size_type pos = 0) const;
    cout  st2.find("abc", 2)  endl; //6   同上,只不过参数不是string而是char*
    //测试size_type find (const chart* s, size_type pos, size_type n) const;
    cout  st2.find("abcdefg", 2, 3)  endl;//6   取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2)
    cout  st2.find("abcbc", 0, 5)  endl;//1   相当于st2.find("abcbc", 0)
    cout  st2.find("abcbc", 0, 6)  endl;//4294967295   第3个参数超出第1个参数的长度时,返回npos
    return 0;
}

应用举例:

//找出字符串str中所有的"abc"(输出位置),若未找到,输出"not find!"
#includeiostream
#includestring

using namespace std;

int main()
{
    string str("babccbabcaabcccbabccabcabcabbabcc");
    int num = 0;
    size_t fi = str.find("abc", 0);    
    while (fi!=str.npos)
    {
        cout  fi  "   ";
        num++;
        fi = str.find("abc", fi + 1);
    }
    if (0 == num)
        cout  "not find!";
    cout  endl;
    return 0;
}
//运行结果:
//1   6   10   16   20   23   29

2.rfind()

原型:

//string (1)
size_type rfind (const basic_string str, size_type pos = npos) const noexcept;
//c-string (2)
size_type rfind (const chart* s, size_type pos = npos) const;
//buffer (3)
size_type rfind (const chart* s, size_type pos, size_type n) const;
//character (4)
size_type rfind (chart c, size_type pos = npos) const noexcept;

说明:
rfind()与find()很相似,差别在于查找顺序不一样,rfind()是从指定位置起向前查找,直到串首。例如,上例中的st1.rfind(‘a‘,7)一句,就是从st1的位置7(st1的最后一个字符b)开始查找字符a,第一次找到的是倒数第2个字符a,所以返回6。
关于rfind(),不再详述,读者可根据find()的示例,自行写代码学习rfind()。

3.find_first_of()

原型:

//string (1)
size_type find_first_of (const basic_string str, size_type pos = 0) const noexcept;
//c-string (2)
size_type find_first_of (const chart* s, size_type pos = 0) const;
//buffer (3)
size_type find_first_of (const chart* s, size_type pos, size_type n) const;
//character (4)
size_type find_first_of (chart c, size_type pos = 0) const noexcept;

说明:
在源串中从位置pos起往后查找,只要在源串中遇到一个字符,该字符与目标串中任意一个字符相同,就停止查找,返回该字符在源串中的位置;若匹配失败,返回npos。

示例(仅给出部分原型的实例,对于其余原型,相信读者有能力仿照前边关于find()的实例来自行写代码测试和学习):

#includeiostream
#includestring

using namespace std;

int main()
{
    //测试size_type find_first_of (chart c, size_type pos = 0) const noexcept;
    string str("babccbabcc");
    cout  str.find(‘a‘, 0)  endl;//1
    cout  str.find_first_of(‘a‘, 0)  endl;//1   str.find_first_of(‘a‘, 0)与str.find(‘a‘, 0)
    //测试size_type find_first_of (const basic_string str, size_type pos = 0) const noexcept;
    string str1("bcgjhikl");
    string str2("kghlj");
    cout  str1.find_first_of(str2, 0)  endl;//从str1的第0个字符b开始找,b不与str2中的任意字符匹配;再找c,c不与str2中的任意字符匹配;再找g,
                                                //g与str2中的g匹配,于是停止查找,返回g在str1中的位置2
    //测试size_type find_first_of (const chart* s, size_type pos, size_type n) const;
    cout  str1.find_first_of("kghlj", 0, 20);//2   尽管第3个参数超出了kghlj的长度,但仍能得到正确的结果,可以认为,str1是和"kghlj+乱码"做匹配
    return 0;
}

应用举例:

//将字符串中所有的元音字母换成*
//代码来自c++ reference,地址:http://www.cplusplus.com/reference/string/basic_string/find_first_of/
#includeiostream
#includestring

using namespace std;

int main()
{
    std::string str("please, replace the vowels in this sentence by asterisks.");
    std::string::size_type found = str.find_first_of("aeiou");
    while (found != std::string::npos)
    {
        str[found] = ‘*‘;
        found = str.find_first_of("aeiou", found + 1);
    }
    std::cout  str  ‘\n‘;
    return 0;
}
//运行结果:
//pl**s* r*pl*c* th* v*w*ls *n th*s s*nt*nc* by *st*r*sks


4.find_last_of()

原型:

//string (1)
size_type find_last_of (const basic_string str, size_type pos = npos) const noexcept;
//c-string (2)
size_type find_last_of (const chart* s, size_type pos = npos) const;
//buffer (3)
size_type find_last_of (const chart* s, size_type pos, size_type n) const;
//character (4)
size_type find_last_of (chart c, size_type pos = npos) const noexcept;

说明:
该函数与find_first_of()函数相似,只不过查找顺序是从指定位置向前,这里仅简单举例,不再赘述,读者可参考find_first_of()自行学习。

示例:

#includeiostream
#includestring

using namespace std;

int main()
{
    //测试size_type find_last_of (const chart* s, size_type pos = npos) const;
    //目标串中仅有字符c与源串中的两个c匹配,其余字符均不匹配
    string str("abcdecg");
    cout  str.find_last_of("hjlywkcipn", 6)  endl;//5   从str的位置6(g)开始想前找,g不匹配,再找c,c匹配,停止查找,返回c在str中的位置5
    cout  str.find_last_of("hjlywkcipn", 4)  endl;//2   从str的位置4(e)开始想前找,e不匹配,再找d,d不匹配,再找c,c匹配,停止查找,
                                                      //    返回c在str中的位置5
    cout  str.find_last_of("hjlywkcipn", 200)  endl;//5   当第2个参数超出源串的长度(这里str长度是7)时,不会出错,相当于从源串的最后一
                                                        //    个字符起开始查找
    return 0;
}

5.find_first_not_of()
原型:

//string (1)
size_type find_first_not_of (const basic_string str, size_type pos = 0) const noexcept;
//c-string (2)
size_type find_first_not_of (const chart* s, size_type pos = 0) const;
//buffer (3)
size_type find_first_not_of (const chart* s, size_type pos, size_type n) const;
//character(4)
size_type find_first_not_of (chart c, size_type pos = 0) const noexcept;

说明:
在源串中从位置pos开始往后查找,只要在源串遇到一个字符,该字符与目标串中的任意一个字符都不相同,就停止查找,返回该字符在源串中的位置;若遍历完整个源串,都找不到满 足条件的字符,则返回npos。

示例(仅简单举例,有了前边的学习,相信读者可以自己学习find_first_not_of()):

#includeiostream
#includestring

using namespace std;

int main()
{
    //测试size_type find_first_not_of (const chart* s, size_type pos = 0) const;
    string str("abcdefg");
    cout  str.find_first_not_of("kiajbvehfgmlc", 0)  endl;//3   从源串str的位置0(a)开始查找,目标串中有a(匹配),再找b,b匹配,再找c,c匹配,
                                                              //    再找d,目标串中没有d(不匹配),停止查找,返回d在str中的位置3
    return 0;
}

将前面应用举例中的fing_first_of()换成find_first_not_of(),就可以将字符串中所有非元音字母换成*。请读者自己验证。

6.find_last_not_of()

原型:

//string (1)
size_type find_last_not_of (const basic_string str, size_type pos = npos) const noexcept;
//c-string (2)
size_type find_last_not_of (const chart* s, size_type pos = npos) const;
//buffer (3)
size_type find_last_not_of (const chart* s, size_type pos, size_type n) const;
//character (4)
size_type find_last_not_of (chart c, size_type pos = npos) const noexcept;

说明:
find_last_not_of()与find_first_not_of()相似,只不过查找顺序是从指定位置向前,这里不再赘述,相信读者可以自行学习。

c++string中用于查找的find系列函数浅析

原文地址:http://www.cnblogs.com/zpcdbky/p/4471454.html

以上就是由(软件教程库https://www.itjcku.com/9999/1091390.html)本站为大家整理

阅读全部内容


Tags:中用顶用查找系列函数浅析

返回首页



推荐内容

Savingoutputofagrepintoafilewithcolors

19 down vote favorite 7 i need to save the result o ...

hibernate异常之QueryException

org.hibernate.queryexception: expected positional parameter ...

Redis的Python客户端redis-py的初步使用

1. 安装 sudo pip install redis sudo pip install hiredis pa ...

《构建高性能Web站点》笔记

书名:构建高性能web站点 出版社: 电子工业出版社 isbn:9787121170935 一 绪论 等待的时间: ( ...

制作OSX10.10.3启动安装U盘

1.获得install os xyosemite.app 2.准备一个8gb的u盘,用磁盘工具抹掉,格式默认的mac o ...

域名解析URL转发

url转发 转发功能:如果您没有一台独立的服务器(也就是没有一个独立的ip地址)或者您还有一个域名b,您想访问a域名时访 ...

instancetypeVSid

英文好的直接读下面链接的文章就好了: http://stackoverflow.com/questions/897222 ...

androidapp开发感想

这几天帮学长做app的时候,照着视频学了json数据的传递,接着遇到了问题,就是httpurlconnection会 ...

常用软件及注册码

vmware-workstation-full-11.0.0-2305329.exe m50ac-j034j-08l8a ...

[POJ3420]QuadTiling

quad tiling time limit:1000ms memory limit:65536k to ...

C-关键字,标识符,注释

一.关键字:c语言中提供了有特殊含义的符号,也叫做保留字。 c语言中一个32个关键字,这些关键字都被赋予了 ...

C-基本概念

一.程序结构 1.c 程序结构:任何一个c程序都是由一个或小个程序代码块组成,每个小程序都有自己的功能,一般称这些小 ...

应该具备的能力

1. 学习能力(learning ability)   有些东西不懂很正常,从不懂到懂,从懂到精通,自己想想,原来不会的 ...

Apache-rhel5.8环境下编译安装

apache安装过程 step 1:安装包gcc或gcc-c++# yum install gcc#yum insta ...

OpenWrt学习目标

最近在研究openwrt,总感觉这一看一点那也了解一点,没有目的,也没有重心。 这里,给自己拟定一个目标,就朝着这个目标 ...

HelloKiki(hdu3579+不互质的中国剩余定理)

hello kiki time limit:1000msmemory limit:32768kb64bit io ...

android环境下摄像头数据采集及显示

以前项目涉及些摄像头预览及数据处理操作,当时的需求是除了做摄像头预览外,还要显示文字、个性图像等,当初在查找资料实 ...

uva10003CuttingSticks简单区间dp

// uva 10003 cutting sticks 区间dp // 经典的区间dp // dp(i,j)表示切割小木 ...

Go的语言特性总结

写在前面: 近来关于对golang的讨论有很多,七牛的几个大牛们也断定go语言在未来将会快速发展,并且很可能会取代ja ...

golang控制channel的出入口

golang控制channel的出入口 我们常常使用channel来在多个goroutine之间做数据通讯,但是cha ...

UVA10479TheHendrieSequence规律

题目大意:一个序列,刚开始由0变到了1,接着往后一个个变化下去 变化的规则是,如果当前数是k,就在这个序列的最后面加上 ...

在不是Activity类中调用Toast和Dialog

有时候我们需要在非activity类中处理一些逻辑,显示toast对话框或者是弹出一个dialog,但是在非activi ...

查询Oraclesql语句中绑定变量值的方法

alter session set nls_date_format = #39;yyyy-mm-dd,hh24:mi:s ...

Hdoj1588GaussFibonacci【矩阵快速幂】

gauss fibonacci time limit: 1000/1000 ms (java/others) m ...

Hdoj5195DZYLovesTopologicalSorting【拓扑】+【线段树】

dzy loves topological sorting time limit: 4000/2000 ms (jav ...

【转自mos文章】使用单条sql来查询出awr中的syatemstatistics

使用单条sql来查询出awr中的syatem statistics 参考自: how to monitor system ...

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植

前段时间就开始学习i.mx6q了,但是最近工作实在是忙,间断了一些时间了。为了提高移植效率,还是考虑移植freescal ...

eclipse应用技巧

最近发现eclipse作为ide还是有很多值得探索的使用技巧的,转载一下他人整理好的资源以做分享。 快捷键的使用,加速 ...

Mysql创建数据库的排序规则中文选择哪种编码

mysql中文编码 mysql创建数据库的排序规则 中文 选择哪种编码原文地址:http://blog. ...

线性表简述

一、简单实现增,删,改、查 package datatructs; /** * 表接口 */ public int ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com