string 查找操作符
s.find( args) |
在 s 中查找 args 的第一次出现 |
s.rfind( args) |
在 s 中查找 args 的最后一次出现 |
s.find_first_of( args) |
在 s 中查找 args 的任意字符的第一次出现 |
s.find_last_of( args) |
在 s 中查找 args 的任意字符的最后一次出现 |
s.find_first_not_of( args) |
在 s 中查找第一个不属于 args 的字符 |
s.find_last_not_of( args) |
在 s 中查找最后一个不属于 args 的字符 |
string 类型提供的 find 操作的参数
c, pos |
在 s 中,从下标 pos 标记的位置开始,查找字符 c。pos 的默认值为 0 |
s2, pos |
在 s 中, 从下标 pos 标记的位置开始, 查找 string 对象 s2。pos 的默认值为 0 |
cp, pos |
在 s 中,从下标 pos 标记的位置形参,查找指针 cp 所指向的 C 风格的以空字符结束的字符串。pos 的默认值为 0 |
cp,pos, n |
在 s 中,从下标 pos 标记的位置开始,查找指针 cp 所指向数组的前 n 个字符。pos 和 n 都没有默认值 |
精确匹配的查找
最简单的查找操作是 find 函数, 用于寻找实参指定的内容。 如果找到则返回第一次匹配的下标值;如果找不到,则返回 npos:
string name("AnnaBelle"); string::size_type pos1 = name.find("Anna"); // pos1 == 0
返回 0,这是子串“Anna”位于字符串“AnnaBelle”中的下标。
默认情况下,find 操作(以及其他处理字符的 string 操作)使用内置操作符比较 string 字符串中的字符。因此,这些操作(以及其他 string 操作)都区分字母的大小写。
以下程序寻找 string 对象中的某个值,字母的大小写影响了程序结果:
string lowercase("annabelle"); pos1 = lowercase.find("Anna"); // pos1 == npos
这段代码使 pos1 的值为 npos ——字符串 Anna 与 anna 不匹配find 操作的返回类型是 string::size_type,请使用该类型的对象存储 find 的返回值。
查找任意字符
如果在查找字符串时希望匹配任意指定的字符,则实现起来稍微复杂一点。
例如,下面的程序要在 name 中寻找并定位第一个数字:
string numerics("0123456789"); string name("r2d2"); string::size_type pos = name.find_first_of(numerics); cout << "found number at index: " << pos << " element is " << name[pos] << endl;
在这个例子中, pos 的值被设置为 1(string 对象的元素下标从 0 开始计数)。
指定查找的起点
可以给 find 操作传递一个可选的起点位置实参,用于指定开始查找的下标位置,该位置实参的默认值为 0。通常的编程模式是使用这个可选的实参循环查找 string 对象中所有的匹配。下面的程序重写了查找“r2d2”的程序,以便找出 name 字符串中出现的所有数字:
string::size_type pos = 0; // each trip reset pos to the next instance in name
while ((pos = name.find_first_of(numerics, pos)) != string::npos) { cout << "found number at index: " << pos << " element is " << name[pos] << endl; ++pos; // move to the next character
}
在这个例子中,首先将 pos 初始化为 0,使第一次循环从 0 号元素开始查找 name。while 的循环条件实现两个功能:从当前 pos 位置开始查找,并将找到的第一个数字出现的下标值赋给 pos。当 find_first_of 函数返回有效的下标值时,输出此次查找的结果,并且让 pos 加 1。
如果漏掉了循环体末尾让 pos 加 1 的语句,那么循环永远都不会结束。考虑没有该操作时,会发生什么情况?第二次循环时,从 pos 标记的位置开始查找,而此时 pos 标记的就是一个数字,于是 find_first_of 函数将(不断重复地)返回同一个 pos 值。
寻找不匹配点
除了寻找匹配的位置外,还可以调用 find_first_not_of 函数查找第一个与实参不匹配的位置。例如,如果要在 string 对象中寻找第一个非数字字符,可以如下编写程序:
string numbers("0123456789"); string dept("03714p3"); // returns 5, which is the index to the character 'p'
string::size_type pos = dept.find_first_not_of(numbers);
反向查找
标准库还提供了一组类似的从右向左查找 string 对象的操作。rfind 成员函数用于寻找最后一个——也就是是最右边的——指定子串出现的位置:
string river("Mississippi"); string::size_type first_pos = river.find("is"); // returns 1
string::size_type last_pos = river.rfind("is"); // returns 4
find 函数返回下标 1,标记 river 字符串中第一个“is”的出现位置;而rfind 函数返回最后一个匹配的位置,而并不是第一个。
find_last_of 函数查找与目标字符串的任意字符匹配的最后一个字符。
find_last_not_of 函数查找最后一个不能跟目标字符串的任何字符匹配的字符。
这两个操作都提供第二个参数,这个参数是可选的,用于指定在 string 对象中开始查找的位置。