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

(1)string::find函数

#include<iostream>
#include<string>
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;
}

(2)string::rfind()函数

rfind()与find()很相似,差别在于查找顺序不一样,rfind()是从指定位置起向前查找,直到串首。例如,上例中的st1.rfind('a',7)一句,就是从st1的位置7(st1的最后一个字符b)开始查找字符a,第一次找到的是倒数第2个字符a,所以返回6。

(3)string::find_first_of()函数

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

#include<iostream>
#include<string>
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;
}

(4)string::find_last_of()函数

该函数与find_first_of()函数相似,只不过查找顺序是从指定位置向前

#include<iostream>
#include<string>
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)string::find_first_not_of()函数

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

#include<iostream>
#include<string>
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;
}

(6)string::find_last_not_of()函数

find_last_not_of()与find_first_not_of()相似,只不过查找顺序是从指定位置向前

转自:https://www.cnblogs.com/zpcdbky/p/4471454.html

关于string类中find函数的讲解的更多相关文章

  1. string类中getline函数的应用

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. c++中string类中的函数

    C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...

  3. C++ string 类中的 assign()函数

    C++ string 类的成员函数,用于拷贝.赋值操作,它们允许我们顺次地把一个 string 对象的部分内容拷贝到另一个 string 对象上. 函数原型 string &operator= ...

  4. C++中string类的操作函数。

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  5. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  6. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

  7. string类中运算符重载实现

    C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...

  8. 【java&c++】父子类中同名函数的覆盖问题

    java和c++两门语言对于父子类中同名函数具有不同的处理方式. 先上两段代码: C++: class Basic { public: void test(string i){ cout <&l ...

  9. Java String类中的intern()方法

    今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法.所以今天看了一下.个人觉得给String类中加入这个方法可能是为了提升一点点性能 ...

随机推荐

  1. 过压保护IC和带LDO模式的Li+充电器前端保护IC

    PW2601是一种充电器前端集成电路,旨在为锂离子提供保护电池充电电路故障.该设备监测输入电压,电池电压以及充电电流,以确保所有三个参数都在正常范围内工作.这个该设备将关闭内部MOSFET断开,以保护 ...

  2. js模仿京东首页的倒计时功能

    模仿京东首页的倒计时 我们学习了定时器,可以用定时器做一个倒计时,于是我模仿了京东首页倒计时. 先看看京东首页的倒计时. 思路: 如何倒计时? 给一个未来的时间.然后计算未来时间到现在的时间戳. 用定 ...

  3. JavaScript 实现排序算法

    参考文章: 十大经典排序算法动画,看我就够了! 1. 冒泡排序 思路 比较所有相邻元素,如果第一个比第二个大,则交换它们 一轮下来,可以保证最后一个数是最大的 执行n-1轮,就可以完成排序 代码 Ar ...

  4. Uber三代API 生命周期管理平台实现 Uber

    Uber三代API 生命周期管理平台实现 - InfoQ https://www.infoq.cn/article/H8Ml6L7vJGQz0efpWvyJ Uber 三代 API 生命周期管理平台实 ...

  5. 逃逸分析与栈、堆分配分析 escape_analysis

    小结: 1.当形参为 interface 类型时,在编译阶段编译器无法确定其具体的类型.因此会产生逃逸,最终分配到堆上. 2.The construction of a value doesn't d ...

  6. WireShark 之 text2pcap

    前言 本来想用 010Editer 的,看到破解教程头都大了,那么就用 WireShark 的 Text2pcap 吧! 正文 打开CMD控制台窗口,转到WireShark安装目录 ,此处可以shif ...

  7. windows10 中 svn 代码统计工具 StatSVN 使用详解

    1.下载TortoiseSVN 下载地址 ps:安装时务必选上命令行的svn命令. 2.下载StatSVN 官网地址 官网上目前时0.7.0版本,我的svn是1.12.0版本,运行时会报错: 所以建议 ...

  8. python中贪婪与非贪婪

    Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符: 非贪婪则相反,总是尝试匹配尽可能少的字符. 在"*","?", ...

  9. 1.Centos7修改主机名

    1.在CentOS7中,有三种定义的主机名: 静态的(Static hostname):也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名. 瞬态的(Tansient ho ...

  10. zabbix错收告警

    这种情况一般出现在重新调整host或者group导致action里的condition发生变化.此时如果一直不能恢复,可尝试将action disable在enable.