1. 程式人生 > 實用技巧 >C++ string 字串函式詳解

C++ string 字串函式詳解

運算子過載

  1. + 和 +=:連線字串
  2. =:字串賦值
  3. >、>=、< 和 <=:字串比較(例如a < b, aa < ab)
  4. ==、!=:比較字串
  5. <<、>>:輸出、輸入字串

注意:使用過載的運算子 + 時,必須保證前兩個運算元至少有一個為 string 型別。例如,下面的寫法是不合法的:

#include <iostream>
#include <string>
int main()
{
    string str = "cat";
    cout << "apple" + "boy" + str; // illegal!
    return 0;
}

查詢

string str;
cin >> str;

str.find("ab");//返回字串 ab 在 str 的位置
str.find("ab", 2);//在 str[2]~str[n-1] 範圍內查詢並返回字串 ab 在 str 的位置
str.rfind("ab", 2);//在 str[0]~str[2] 範圍內查詢並返回字串 ab 在 str 的位置

//first 系列函式
str.find_first_of("apple");//返回 apple 中任何一個字元首次在 str 中出現的位置
str.find_first_of("apple", 2);//返回 apple 中任何一個字元首次在 str[2]~str[n-1] 範圍中出現的位置
str.find_first_not_of("apple");//返回除 apple 以外的任何一個字元在 str 中首次出現的位置
str.find_first_not_of("apple", 2);//返回除 apple 以外的任何一個字元在 str[2]~str[n-1] 範圍中首次出現的位置

//last 系列函式
str.find_last_of("apple");//返回 apple 中任何一個字元最後一次在 str 中出現的位置
str.find_last_of("apple", 2);//返回 apple 中任何一個字元最後一次在 str[0]~str[2] 範圍中出現的位置
str.find_last_not_of("apple");//返回除 apple 以外的任何一個字元在 str 中最後一次出現的位置
str.find_last_not_of("apple", 2);//返回除 apple 以外的任何一個字元在 str[0]~str[2] 範圍中最後一次出現的位置

//以上函式如果沒有找到,均返回string::npos
cout << string::npos;

子串

str.substr(3); //返回 [3] 及以後的子串
str.substr(2, 4); //返回 str[2]~str[2+(4-1)] 子串(即從[2]開始4個字元組成的字串)

替換

str.replace(2, 4, "sz");//返回把 [2]~[2+(4-1)] 的內容替換為 "sz" 後的新字串
str.replace(2, 4, "abcd", 3);//返回把 [2]~[2+(4-1)] 的內容替換為 "abcd" 的前3個字元後的新字串

插入

str.insert(2, "sz");//從 [2] 位置開始新增字串 "sz",並返回形成的新字串
str.insert(2, "abcd", 3);//從 [2] 位置開始新增字串 "abcd" 的前 3 個字元,並返回形成的新字串
str.insert(2, "abcd", 1, 3);//從 [2] 位置開始新增字串 "abcd" 的前 [2]~[2+(3-1)] 個字元,並返回形成的新字串

追加

除了用過載的 + 操作符,還可以使用函式來完成。

str.push_back('a');//在 str 末尾新增字元'a'
str.append("abc");//在 str 末尾新增字串"abc"

刪除

str.erase(3);//刪除 [3] 及以後的字元,並返回新字串
str.erase(3, 5);//刪除從 [3] 開始的 5 個字元,並返回新字串

交換

str1.swap(str2);//把 str1 與 str2 交換

其他

str.size();//返回字串長度
str.length();//返回字串長度
str.empty();//檢查 str 是否為空,為空返回 1,否則返回 0
str[n];//存取 str 第 n + 1 個字元
str.at(n);//存取 str 第 n + 1 個字元(如果溢位會丟擲異常)

例項

查詢給定字串並把相應子串替換為另一給定字串

string 並沒有提供這樣的函式,所以我們自己來實現。由於給定字串可能出現多次,所以需要用到 find() 成員函式的第二個引數,每次查詢之後,從找到位置往後繼續搜尋。直接看程式碼(這個函式返回替換的次數,如果返回值是 0 說明沒有替換):

int str_replace(string &str, const string &src, const string &dest)
{
    int counter = 0;
    string::size_type pos = 0;
    while ((pos = str.find(src, pos)) != string::npos) {
        str.replace(pos, src.size(), dest);
        ++counter;
        pos += dest.size();
    }
    return counter;
}

從給定字串中刪除一給定字串

方法和上面相似,內部使用 erase() 完成。程式碼:

int str_erase(string &str, const string src)
{
    int counter = 0;
    string::size_type pos = 0;
    while ((pos = str.find(src, pos)) != string::npos) {
        str.erase(pos, src.size());
        ++counter;
    }
    return counter;
}

給定一字串和一字符集,從字串剔除字符集中的任意字元

int str_wash(string &str, const string src)
{
    int counter = 0;
    string::size_type pos = 0;
    while ((pos = str.find_first_of(src, pos)) != string::npos) {
        str.erase(pos, 1);
        ++counter;
    }
    return counter;
}