[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
- 將string物件和string物件、字串字面或C樣式字串做比較
- 使用關係運算子:「 >、>=、<、<=、==、!=」
- 字串搜尋
- 使用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_of( )方法可找到string物件中,第一次出現任一個指定字元的位置,位置由0開始計數
- 找非指定字元的位置
- 使用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
-
- 使用find_first_not_of( )方法可找到string物件中,第一次出現非指定字元的位置
- 插入字串
- 使用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
- 使用insert( )方法可以插入字串
- 取代子字串
- 使用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;