string 類型的查找操作


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 對象中開始查找的位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM