string 类型的查操作
string 查操作符
string 类型提供的 find 操作的参数
精确匹配的查
最简单的查操作是 find 函数, ⽤于寻实参指定的内容。 如果到则返回第⼀次匹配的下标值;如果不到,则返回npos :
返回 0,这是⼦串“Anna”位于字符串“AnnaBelle”中的下标。
默认情况下,find 操作(以及其他处理字符的 string 操作)使⽤内置操作符⽐较 string 字符串中的字符。因此,这些操作(以及其他 string 操作)都区分字母的⼤⼩写。
以下程序寻 string 对象中的某个值,字母的⼤⼩写影响了程序结果:
这段代码使 pos1 的值为 npos ——字符串 Anna 与 anna 不匹配find 操作的返回类型是 string::size_type ,请使⽤该类型的对象存储 find 的返回值。
查任意字符
如果在查字符串时希望匹配任意指定的字符,则实现起来稍微复杂⼀点。
例如,下⾯的程序要在 name 中寻并定位第⼀个数字:
在这个例⼦中, pos 的值被设置为 1(string 对象的元素下标从 0 开始计数)。
指定查的起点
可以给 find 操作传递⼀个可选的起点位置实参,⽤于指定开始查的下标位置,该位置实参的默认值为 0。通常的编程模式是使⽤这个可选的实参循环查 string 对象中所有的匹配。下⾯的程序重写了查“r2d2”的程序,以便出 name 字符串中出现的所有数字: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 的字符c, pos
在 s 中,从下标 pos 标记的位置开始,查字符 c 。pos 的默认值为 0s2, pos
在 s 中, 从下标 pos 标记的位置开始, 查 string 对象 s2。pos 的默认值为 0cp, pos
在 s 中,从下标 pos 标记的位置形参,查指针 cp 所指向的 C 风格的以空字符结束的字符串。pos 的默认值为 0cp,pos, n
在 s 中,从下标 pos 标记的位置开始,查指针 cp 所指向数组的前 n 个字符。pos 和 n 都没有默认值
string name("AnnaBelle");
string ::size_type pos1 = name.find("Anna"); // pos1 == 0string lowercase("annabelle");
pos1 = lowercase.find("Anna"); // pos1 == npos
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;
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 对象中开始查的位置。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论