Bootstrap

一文读懂字符串find和find_first_of哪些事

find()

C++字符串string中find()返回值是字母或者子字符串在原串中的位置(下标从0开始)。如果没有找到则返回一个特别的标记npos(返回值可以看成一个int型的数据)str2.find(str1,a,b)//从原字符串的a位置查询str1的前b个字符出现的位置
这里命名str2为源串,str1为目标串

string s = "1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i";
//find查找单个字符
cout << s.find("a") << endl;//1返回找到的第一个符合的下标
cout << s.rfind("a") << endl;//36 反向查找
cout << s.find("z") << endl;//没有找到,返回特别标记npos,这里等于一个特别大的数4294967295

//find查找子字符串是把目标串看成整体
cout << s.find("2b") << endl;//2,注意返回的是目标串在源字符串中第一次匹配的第一个元素2下标
cout << s.find("2c") << endl;npos//目标串是一个整体去比对的

cout << s.rfind("2b") << endl;//22,反向查找字符串时,依然返回目标串在元字符串中第一次匹配的第一个元素2的下标,而不是b


//查找某一特定位置pos(包括此位置处)之后的子串位置
cout << s.find("a",2) << endl;//21
cout << s.find("2b",2) << endl;//2,目标串首位置在pos处
cout << s.find("2b",3) << endl;//22

find_first_of and last

//查找首次及最后一次出现的位置
//对单个字符没有错误
cout << s.find_first_of("a") << endl;//1
cout << s.find_last_of("a") << endl;//36

//对目标字符串会出现不同的规则,把目标字符串看成是多个字符组成的,找到在源字符串中存在的第一个字符位置
cout << s.find_first_of("b4") << endl;//3
cout << s.find_last_of("b4") << endl;//26
cout << s.find_first_of("4b") << endl;//3
cout << s.find_last_of("4b") << endl;//26
cout << s.find_last_of("b4") << endl;//26
//注:会发现,first和last是只要找到目标串中的一个字母符合即可,甚至不考虑目标串中字母的顺序,只要有一个字符在源字符存在也可返回正确位置 !
//当然也可能是库版本不同造成的,本文是在studio2015版本测试的

两者的区别

1.对于目标串是单个字符时,两者没什么区别。
2.当子串是一个多字符组成的字符串时,find()是将子串看出整体去和模式串匹配,但find_first_of 和 find_last_of 是只要在源串中遇到一个字符,该字符与目标串中任意一个字符相同,就停止查找,返回该字符在源串中的位置;若匹配失败,返回npos

find_first_not_of()

cout << s.find_first_not_of("12") << endl;//1,源串中a是第一个在目标串中没有的字符
cout << s.find_first_not_of("1a2") << endl;//3,源串中b是第一个在目标串中没有的字符

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

find_last_not_of()

可以比照着上文写出,只不过查找顺序改变了!

;