Cpp 進階:String 字符串
簡介
原來 C 中使用字符串時,是一個以 \0
結尾的字符序列(char[]
),而 string
庫提供了一個字符串類,提供一些基本的字符串操作手段,將程序員從重複的方法構造中解放出來,也是大部分程序最常用到的類沒有之一。接下來就來看看到底該如何使用這個類吧。
參考
C/C++ - String 用法與心得完全攻略 | https://mropengate.blogspot.com/2015/07/cc-string-stl.html |
正文
Overview 總覽
string
類對許多操作符都進行重載,像是 assign
可以用 =
、append
可以用 +
、compare
可以用 < <= > >=
替代,在使用時可以避免需要去既很多的方法名直接使用更直白的操作符。以下列出本篇幾介紹的所有操作:
- 構造方法
- 擷取單個字符或子串
- 偏移量:
s[]
、s.at
- 擷取子串:
s.substr
- 查找子串:
s.find
- 偏移量:
- 修改字符串
- 賦值:
=
、s.assign
- 連接(添加):
+
、s.append
- 插入:
s.insert
- 刪除:
s.erase
- 賦值:
- 其他屬性
- 字符串長度:
s.size
、s.length
- 判斷空串:
s.empty
- 比較:
< <= > >= ==
、compare
- 字符串長度:
Import 引入
#include<string>
構造函數
首先先來介紹如何創建一個字符串(string)
類,我們可以透過直接量或是其他字符串來創建一個字符串:
int main() {
// 棧上變量
string s1;
cout << "s1: " << s1 << endl; // s1:
// 傳入字符串直接量
string s2("string 2");
cout << "s2: " << s2 << endl; // s2: string 2
// 傳入另一個 string
string s3(s2);
cout << "s3: " << s3 << endl; // s3: string 2
// 使用直接量初始化
string s4 = "string 4";
cout << "s4: " << s4 << endl; // s3: string 4
}
擷取單個字符或子串(查)
接下來介紹查找字符串的方法,我們可以查找字串位置或是查找指定位置的子串
- 語法
// 偏移量,查找指定位置字符
s[index]
s.at(index)
// 擷取子串,start、n 為可選,表示`起始位置`和`長度`
s.substr(start, n)
// 查找子串,返回子串第一次出現的位置;start 可選,表示查找起始位置
s.find(str, start)
- Sample
int main() {
string s = "abcdefg";
cout << s << endl; // abcdefg
// 使用偏移量,UTF-8 編碼時需注意
cout << s[1] << endl; // b
// 使用 at 方法
cout << s.at(2) << endl; // c
// 擷取子串
cout << s.substr(3, 3) << endl; // def
// 查找子串,不存在時返回 -1
cout << s.find("e") << endl; // 4
cout << (int)s.find("e", 5)<< endl; // -1
}
修改字符串(增、刪、改)
修改字符串的方法可以分為四類:重新賦值、插入、連接、刪除
- 語法
// 連接字符串,start、n 為可選,分別表示`起始位置`和`長度`
s1 + s2
s1.append(s2, start, n) // 等價於 s1 += s2.substr(start, end)
// 重新賦值,同樣 start、n 為可選
s1 = s2
s1.assign(s2, start, n) // 等價於 s1 = s2.substr(start, end)
// 插入字符串,pos 表示插入位置、n 為字符重複次數、str 為字符串、c 為單個字符
s.insert(pos, str)
s.insert(pos, n, c)
// 刪除子串,pos 表示起始位置、n 為刪除長度
s.erase(pos, n)
- Sample
int main() {
string s;
// 直接量賦值
s = "___";
cout << s << endl; // ___
// 連接字符串
s += "__";
cout << s << endl; // _____
// 插入字符串
s.insert(1, "2");
cout << s << endl; // _2____
// 插入重複字符,第二個參數為次數
s.insert(3,3, '4');
cout << s << endl; // _2_444___
// 重新賦值,與 s = string("abcde").substr(2, 4) 等價
s.assign("abcde", 2, 4);
cout << s << endl; // cde
// 於結尾連接字符串,與 s += string("abcde").substr(2, 4) 等價
s.append("abcde", 2, 4);
cout << s << endl; // cdecde
// 刪除子串
s.erase(1, 4);
cout << s << endl; // ce
}
其他屬性
省下的諸如長度、比較、判斷空串等方法
- 語法
// 長度
s.size()
s.length()
// 判斷空串
s.empty()
// 比較
s1 ( == | < | <= | > | >= ) s2
s1.compare(s2)
- Sample
int main() {
string s1 = "12345";
string s2 = "67890";
string s3 = "12345";
// 字符串長度
cout << s1.size() << endl; // 5
cout << s1.length() << endl; // 5
// 判斷字符串是否為空
cout << s1.empty() << endl; // 0
// 比較字符串內容
cout << (s1 == s2) << endl; // 0
cout << (s1 == s3) << endl; // 1
cout << (s1 < s2) << endl; // 1
cout << s1.compare(s2) << endl; // -5
}
結語
看起來好像很多複雜的操作,其實都離不開增刪改查,不過是提供了各種形式的方法選用而已,供大家參考。