[C++, CPP 教學 教程 教材 Tutorial] 進階資料型態(Advance Data Type) - string物件(string object)
YehYeh\'s Notepad yehyeh@gmail.com 

[C++, CPP] 進階資料型態

string物件

  • string物件
    • string型別:定義在<string>標頭檔中,std名稱空間中
    • string是複合型別(Compound Type)
    • string型態不需結束字元('\0')
    • 宣告
      • string 變數名稱;
    • 宣告並初始化
      • string 變數名稱 = "初始字串";
      • string 變數名稱( "初始字串");
      • string 變數名稱( 次數, "初始字串");
        • string myString = (3, "A");
          cout << myString << endl;    //印出AAA
          
    • 由已存在的變數初始化
      • string 變數名稱 = 舊變數名稱;
      • string 變數名稱(舊變數名稱);
      • string 變數名稱(舊變數名稱, 起始位置, 字數);
        • string oldString = "Hello World";
          string newString(oldString, 2, 6);
          cout << newString << endl;    //印出llo Wo
          
    • 指派字串字面給string變數時,一定要用雙引號,不可用單引號指派字元
      • string myString = "A";      O
        string myString = 'A';      X
        
  • 字串連結(concatenation):將2個字串物件或1個字串物件和字串字面合併成一個字串
    • 使用+連結
    • 可連結2個字串物件
      • myString1 = myString1 + myString2;
        
    • 可連結1個字串物件和字串字面
      • myString1 = myString1 + " World";
        
    • 不可連結2個字串字面,會出現編譯錯誤
      • 有些情況可用小括號來避免編譯錯誤
      • myString1 = "Hello " + "World";             X
        myString1 = "Hello" + " " + myString2;      X
        myString1 = "Hello" + (" " + myString2);    O
        
  • 存取字串的字元
    • 可用和字元陣列相同方式存取字元
    • 變數[索引]
    • 索引由0開始計數
    • string myString = "ABCDE";
      cout << myString[2] << endl;    //印出C
      
  • 取得字串長度
    • 可用length( )方法來取得字串長度
    • length( )傳回的型態為size_t,相當於無號整數
    • . 成員存取運算子(access operator)或點運算子(dot operator)
      • string myString = "ABCDE";
        cout << myString.length( ) << endl;
        
    • 有時編譯時可能產生錯誤,可將型態改為size_t
      •   for(int i = 0; i < myString.length( ); i++)
        ⇒ for(size_t i = 0; i < myString.length( ); i++)
        
  • 輸入字串
    • getline( )函式定義在<string>標頭中
    • getline(cin, 字串物件); //不需指定最大長度,讀到\n為止
    • getline(cin, 字串物件, 結尾字元); //讀到結尾字元為止
      • gelline(cin, myString, '?');
        
  • 取得子字串
    • 使用substr( )方法來取得子字串
    • substr( 索引, 長度);
      • string myString = "Hello World";
        
        //由第2個位置開始取3個字元 ⇒ 印出llo
        cout << myString.substr(2, 3) << endl; 
        
    • 索引由0開始計數
    • 若長度超過字串的長度,則只取到最後一個字元
      • string subString1 = myString.substr(2, 100);
        cout << subString1 << endl;    //印出llo World 
        
    • 若無指定長度,則取到最後一個字元
      • string subString2 = myString.substr(2);
        cout << subString2 << endl;    //印出llo World 
        
  • 字串比較
    • 使用關係運算子:「 >、>=、<、<=、==、!=
      • 可2個字串物件作比較
      • 可1個字串物件和一個C語言樣式字串作比較
      • 可1個字串物件和一個字串字面作比較
      • 依每個字元的ASCII碼比較
        • "ABC" < "abc" ⇒ true 
          
      • 比較至有不同字元出現為止或任一字串結尾
      • 若字元碼皆相同,則長度較短的較小
        • "ab" < "abc" ⇒ true
          
    • compare( )方法
      • string物件string物件、字串字面或C樣式字串做比較
        • 回傳int型別的值,正數表示大於,0表示等於,負數表示小於
        • compare(物件);
        • 將ABC和abc作比較
          string myString="ABC"; 
          cout << myString.compare("abc");    //印出-1
          
      • 子字串和其它物件做比較
        • compare(索引, 長度, 物件);
        • 將aaBBcc中的BB和BB作比較
          string myString = "aaBBcc";
          cout << myString.compare(2, 2, "BB");    //印出0
          
      • 子字串和其它物件的子字串做比較
        • compare(索引1, 長度1, 物件, 索引2, 長度2);
        • 將aaBBcc中的BB和ccaaBB中的BB作比較
          string myString = "aaBBcc";
          cout << myString.compare(2, 2, "ccaaBB",4, 2);    //印出0
          
      • 子字串和其它物件的前幾個字元做比較
        • compare(索引1, 長度1, 物件, 字元數 );
        • 將aaBBcc中的BB和BBccaa中的BB作比較
          string myString = "aaBBcc";
          cout << myString.compare(2, 2, "BBccaa",2);	//印出0
          
  • 字串搜尋
    • 使用find( )方法可找到指定字串第一次出現的位置
    • 使用rfind( )方法可找到指定字串最後一次出現的位置
    • 回傳值為型態為size_t,即無號整數
    • find("字串")
    • string  myString = "ABCDEF";
      cout << myString.find("CDE") << endl;    //印出2
      cout << myString.find("GHI") << endl;    //印出string::npos → 4,294,967,295
      
    • string::npos:常數值,為系統所能表示的最大整數,不同系統值可能會不同,代表非法字元位置
      • string  myString = "ABCDEF";
        if( myString.find("GHI") == std::npos)
            cout << "Not Find" << endl;
        
    • find("字串", 起始位置)
      • string myString = "AABBAACC";
        cout << myString.find("AA", 3) << endl;    //印出4
        
  • 找指定字元的位置
    • 使用find_first_of( )方法可找到string物件中,第一次出現任一個指定字元的位置,位置由0開始計數
      • string myString = "Hello World";
        cout << myString.find_first_of("AaEeIiOoUu") << endl;  //H[e]llo ⇒ 印出1
        
    • 使用find_last_of( )方法可找到string物件中,最後一次出現任一個指定字元的位置,位置由0開始計數
      • string myString = "Hello World";
        cout << myString.find_last_of("AaEeIiOoUu") << endl;    //W[o]rld ⇒ 印出7
        
  • 找非指定字元的位置
    • 使用find_first_not_of( )方法可找到string物件中,第一次出現非指定字元的位置
      • string myString = "Hello World";
        cout << myString.find_first_of("AaEeIiOoUu") << endl;  //[H]ello ⇒ 印出0
        
    • 使用find_last_not_of( )方法可找到string物件中,最後一次出現非指定字元的位置
      • string myString = "Hello World";
        cout << myString.find_first_of("AaEeIiOoUu") << endl;  //Worl[d] ⇒ 印出10
        
  • 插入字串
    • 使用insert( )方法可以插入字串
      • insert(插入位置, "字串")
      • string myString = "AACC";
        cout << myString.insert(2,"BB") << endl;	//印出AABBCC
        
    • 插入子字串
      • myString.insert(插入位置, "字串", 索引, 長度)
      • string myString = "AACC";
        cout << myString.insert(2,"DDBBBEEE",2,3) << endl;  //印出AABBBCC
        
    • 在字串中由前面取出指定長度的子字串,插入到字串物件中
      • myString.insert(插入位置, "字串", 長度)
      • string myString = "AACC";
        cout << myString.insert(2,"BBBEEE",3) << endl;  //印出AABBBCC
        
    • 在指定位置依次數插入指定字元
      • myString.insert(插位位置, 次數, 字元)
      • string myString = "AACC";
        cout << myString.insert(2, 3, 'B') << endl;  //印出AABBBCC
        
  • 取代子字串
    • 使用replace( )方法取代子字串
    • replace(位置, 長度, 新字串)
      • string myString = "AAACCCC";
        cout << myString.replace(1, 3, "BB") << endl;	//印出ABBCCC
        
    • replace(位置1, 長度1, 新字串, 位置2, 長度2)
      • string myString = "AAACCCC";
        cout << myString.replace(1, 3, "ABBC", 1, 2) << endl;  //印出ABBCCC
        
    • replace(位置1, 長度1, 新字串, 長度2)
      • string myString = "AAACCCC";
        cout << myString.replace(1, 3, "BBC",  2) << endl;	//印出ABBCCC
        
    • replace(位置1, 長度1, 次數, 字元)
      • string myString = "AAACCCC";
        cout << myString.replace(1, 3, 2, B) << endl;	//印出ABBCCC
        
  • 移除部份字元
    • earse( )方法
    • earse(位置, 長度)
      • string myString = "AAABBCCC";
        cout << myString.earse(1, 2) << endl;	//印出ABBCCC
        
  • 移除全部字元
    • clear( )方法
    • clear( )
      • string myString = "AAABBCCC";
        cout << myString.clear( ) << endl;    //不顯示任何結果
        
  • string物件陣列
    • 宣告及初始化:
      • string 陣列名稱[ ] = {"初始值1","初始值2",...,"初始值n"}
    • 存取指定字串:
      • 陣列名稱[字串索引]
    • 存取指定字串字元:
      • 陣列名稱[字串索引][字元位置]
    • string myStringArray[ ] = {"hello", "world", " C++"};
      myStringArray[2][1] = '-';
      cout << myStringArray[2] << endl;    //印出C-+
      
  • 寬字元字串
    • 若字串包含wchar_t型別的字元,需使用<string>標頭檔中定義的wstring
    • 指派字串前,需要加上L以便和一般字串做區分
    • 輸出時需使用wcout物件
    • wstring 字串名稱
    • wstring 字串名稱 = L"寬字元字串"
    • wstring myWString = L"Hello World";
      wcout << myWString << endl;