8.8.5 搜索字符串(1)
搜索给定字符或子串的string对象的find()函数有4个版本,分别列出在表8-3中。
表 8-3
|
函 数< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
说 明 |
|
size_t find(char ch,
size_t offset=0) |
在string对象中搜索从offset
索引位置开始的字符ch。可以
省略第二个实参,在这种情况下
默认值为0 |
|
size_t find(char char* pstr,
size_t offset=0) |
在string对象中搜索从offset
索引位置开始的以空字符结尾的
字符串pstr。可以省略第二个实参,
在这种情况下默认值为0 |
|
size_t find(char char* pstr,
size_t offset,
size_t count) |
在string对象中搜索从offset索引
位置开始的以空字符结尾的字符串
pstr的前count个字符 |
|
size_t find(const string str,
size_t offset=0) |
在string对象中搜索从offset索引
位置开始的字符串对象str。可以
省略第二个实参,在这种情况
下默认值为0 |
find()函数的各个版本都返回发现字符或子串的第一个字符的索引位置。如果没有找到要找的条目,该函数会返回值string::npos。后一个值是在string类中定义的一个常量,表示string对象中的一个非法位置,它通常用来标识搜索失败。
下面的代码片段显示了find()函数的部分用法:
- 下面的代码片段显示了find()函数的部分用法:
-
- string phrase("So near and yet so far");
- string str("So near");
- cout << phrase.find(str) << endl; // Outputs 0
- cout << phrase.find("so far") << endl;// Outputs 16
- cout << phrase.find("so near") << endl;
// Outputs string::npos = 4294967295
string::nops的值可能根据不同的C++(www.cppentry.com)编译器实现而不同,因此,为了测试它,我们应总是使用string::npos,而不是使用显式的值。
下面是反复扫描同一个字符串以搜索出现的特定子串的又一示例:
- string str( "Smith, where Jones had had \"had had\", \"had had\" had."
- " \"Had had\" had had the examiners' approval.");
- string substr("had");
-
- cout << "The string to be searched is:"
- << endl << str << endl;
- size_t offset = 0;
- size_t count = 0;
- size_t increment = substr.length();
-
- while(true)
- {
- offset = str.find(substr, offset);
- if(offset == string::npos)
- break;
- offset += increment;
- ++count;
- }
- cout << endl << " The string \"" << substr
- << "\" was found " << count << " times in the string above."
- << endl;
在这段代码中,我们搜索str,查看其中出现"had"的次数。此搜索在while循环中完成,其中offset记录发现的位置,该位置也用作搜索的起始位置。该搜索从索引位置0(字符串的开头)开始,每次发现子串时,就将下一次搜索的新起始位置设置为发现的位置加上子串的长度。这样可以确保绕过发现的子串。每次发现子串时,计数就递增。如果find()返回string::npos,就表示没有发现子串,搜索结束。执行该代码片段产生如下输出:
- The string to be searched is:
- Smith, where Jones had had "had had", "had had" had. "Had had" had had
- the examiners' approval.
-
- The string "had" was found 10 times in the string above.
当然,"Had"与"had"不匹配,因此正确结果为10。
find_first_of()和find_last_of()成员函数在string对象中搜索出现的给定集合中的任何字符。例如,我们可能在字符串中搜索空格或标点符号(它们可以用来将一个字符串分解为单个单词)。这两个函数都有几个版本,如表8-4所示。
表 8-4
|
函 数 |
说 明 |
|
find_first_of(char ch,
size_t offset=0) |
在string对象中搜索从offset索
引位置开始出现的字符ch,并返
回发现字符的索引位置值,类型为
size_t。如果省略第二个实参,
offset的默认值就为0 |
|
find_first_of(char* pstr,
size_t offset=0) |
在string对象中搜索从offset索引
位置开始第一次出现的以空字符结
尾的字符串pstring中的任何字符,
并返回发现字符的索引位置值,类型
为size_t。如果省略第二个实参,
offset的默认值就为0 |
|
find_first_of(char* pstr,
size_t offset,
size_t count) |
在string对象中搜索从offset索引位
置开始第一次出现的以空字符结尾的
字符串pstring中的前count个字符中
的任何字符,并返回发现字符的索引
位置值,类型为size_t |
|
find_first_of(string str,
size_t offset=0) |
在string对象中搜索从offset索引位
置开始第一次出现的字符串str中的
任何字符,并返回发现字符的索引位
置值,类型为size_t。如果省略第二
个实参,offset的默认值就为0 |
|
find_last_of(char ch,
size_t offset=npos) |
在string对象中向后搜索从offset索
引位置开始最后一次出现的字符ch,
并返回发现该字符的索引位置值,
类型为size_t。如果省略第二个实参,
offset的默认值就为字符串的末尾字符nops |
(续表)
|
函 数 |
说 明 |
|
find_last_of(char* pstr,
size_t offset=npos) |
在string对象中向后搜索从offset
索引位置开始最后一次出现的以空
字符结尾的字符串pstr中的任何字符,
并返回发现该字符的索引位置值,类
型为size_t。如果省略第二个实参,
offset的默认值就为字符串的末尾字符nops |
|
find_last_of(char* pstr,
size_t offset,
size_t count) |
在string对象中向后搜索从offset索引
位置开始最后一次出现的以空字符结
尾的字符串pstr中的前count个字符,
并返回发现该字符的索引位置值,
类型为size_t |
|
find_last_of(string str,
size_t offset=npos) |
在string对象中向后搜索从offset索引
位置开始最后一次出现的字符串str中
的任何字符,并返回发现该字符的索引
位置值,类型为size_t。如果省略
第二个实参,offset的默认值就为字
符串的末尾字符npos |