取代 C 風格 char*,優勢:自動記憶體管理、內建豐富操作、支援 = 賦值、== 比較、+ 串聯,可視為基本型別使用。
#include <string> // 注意非 string.h (C 風格)
| 形式 | 說明 |
|---|---|
string s; | 空字串 |
string s(str); | 拷貝建構 |
string s(str, pos); | 自 pos 起至結尾 |
string s(str, pos, len); | 自 pos 起長度 len |
string s(cstr); | C 字串建構 |
string s(chars, len); | C 字串前 len 字元 |
string s(n, c); | n 個字元 c |
string s(beg, end); | 迭代器區間 [beg, end) |
c_str():回傳以 \0 結尾的 const char* (安全)data():回傳字元陣列 const char* (不保證以 \0 結尾)copy(buf, len):複製內容至既有緩衝區警告:c_str() 回傳 const char*,若舊 API 需 char* 且不修改內容,可 const_cast;若會修改,**必須拷貝至非 const 緩衝區**,否則行為未定義。
size() / length():目前字元數empty():是否為空max_size():理論最大字元數capacity():重新配置前可容納字元數reserve(n):預留容量 (避免頻繁重配置)operator[]:不檢查邊界,const string 下 [size()] 回傳 \0at():檢查邊界,越界拋出 out_of_range避免取得元素參考/指標後再操作字串 (可能導致重配置而失效)。
== != < <= > >=:字典序比較compare():多載支援子串比較、指定長度、C 字串比較,回傳 0/正/負string s("abcd");
s.compare("abcd"); // 0
s.compare("dcba"); // < 0
s.compare("ab"); // > 0
s.compare(0, 2, s, 2, 2); // "ab" vs "cd" → < 0
s = "new"; s = other; s = 'c';
s.assign(str); s.assign(str, 1, 3); s.assign(str, 2, npos);
s.assign("nico", 5); s.assign(5, 'x');
s = ""; s.clear(); s.erase();
s += str; s.append(str); s.push_back('c');
s.insert(pos, str); s.insert(pos, n, 'c');
s.erase(pos); s.erase(pos, n);
s.replace(pos, n, str); s.replace(pos, n, str, subpos, sublen);
s.substr(); s.substr(pos); s.substr(pos, len); s3 = s1 + s2; // 運算子+
cin >> s; // 讀單詞 (空白斷行) getline(cin, s); // 讀整行 cout << s;
| 函式 | 說明 |
|---|---|
find(str/char, pos) | 正向找子串/字元 |
rfind(str/char, pos) | 反向找 |
find_first_of(set, pos) | 找集合中任一字元首次出現 |
find_last_of(set, pos) | 反向找集合字元 |
find_first_not_of(set, pos) | 找不在集合中的字元 |
find_last_not_of(set, pos) | 反向找不在集合中 |
回傳 size_type 索引,找不到回傳 npos (static constant)。比較時建議直接 if (s.find(...) == string::npos)。
begin() / end():正向rbegin() / rend():反向符合 STL 容器慣例,可搭配演算式使用。