2015年7月23日 星期四

C/C++ - String 用法與心得完全攻略

 






一、String 簡介


string 是一個保存 char 的序列容器,把字串的記憶體管理責任交由 string 負責而不是 programmer,減輕了 C 語言風格字串的麻煩,使用前預先 #include <string> 即可。


String 的特色


  • 提供了大量的字串操作函式。
  • 可與 C 語言風格字串雙向轉換。




二、成員函式介紹


string overload 許多 operator,包括 +、+=、<、=、[]、<<、>> 等,這些 operator 對字串操作非常方便,因此 assign()、append()、compare() 等函數,除非一些特殊需求,不然一般是用不上。儘量使用 operator,這樣可以讓程序更加易懂。


常用方法


  • 賦值 = : 將字串指定給另一個字串。
  • 相等比較 == : 比較兩個字串的字元內容是否相同。
  • 串接字串 + : 直接使用 + 運算子來串接字串。
  • 存取字符 []、str.at() : 如字元陣列的操作,at 帶邊界檢查。
  • 字串長度 str.size() : 字串長度。
  • 字串為空 str.empty() : 字串是否為空
  • 字串長度 str.length() : 字串的長度。


[用心去感覺] 串接 operator +

只要等式裡有一個 string,就可以一直連續用 string overload 的 + 功能。(需要注意的是,在開始的兩項中必須有一項是 string,不然 compiler 在解語法樹的時候會出錯。)


[用心去感覺] 賦值 operator =

可以將一個 C-Style 的字串指定給 string,但不能將一個 string 指定給 char 陣列。


[用心去感覺] 存取 operator [], str.at()

講究效率,使用 [],講究穩定性,使用at()。


進階用法


  • assign(str, start, num) : 從 str 的第 start 個字元取出 num 個字元來指定給另一字串物件。
  • append(str, start, num) : 從 str 的第 start 個字元取出 num 個字元來附加至另一字串物件之後。
  • find(str, 0) : 從引發 find() 的字串物件中第 0 個字元尋找是否有符合 str 的子字串。
  • insert(start, str) : 將 str 插入引發 insert() 的字串物件第 start 個字元之後。


[用心去感覺] find() 錯誤返回 basic_string::npos

basic_string::npos
static const size_type npos = -1;

npos 是一個常數,表示 size_t 的最大值。許多容器都有提供,用以表示不存在的位置。




三、常用的string程式寫法


#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string str1; 
    string str2("caterpillar"); 
    string str3(str2); 

    // assign: 指定字串 
    str1 = str1.assign(str2, 0, 5); 
    cout << "str1: " << str1 << endl; 
    str1 = str1.assign("caterpillar", 5, 6); 
    cout << "str1: " << str1 << endl; 

    str1 = ""; 

    // append: 字串串接 
    str1 = str1.append(str2, 0, 5); 
    str1 = str1.append(str3, 5, 6); 
    cout << "str1: " << str1 << endl; 

    // find: 尋找字串位置 
    cout << "尋找str1中的第一個pill: " 
         << str1.find("pill", 0) << endl; 

    // insert: 插入字串 
    cout << "在str1插入字串***: " 
         << str1.insert(5, "***") << endl; 

    cout << "str1長度: " << str1.length() << endl; 
 
    return 0; 
}

執行結果:
str1: cater
str1: pillar
str1: caterpillar
尋找str1中的第一個pill: 5
在str1插入字串***: cater***pillar
str1長度: 14






References









技術提供:Blogger.