在C++中,處理字符串最常用的工具是string類。它比C語言的字符數組(char[])更安全、更易用,能幫我們避免很多內存管理問題。本文將從零開始,帶你瞭解string的基本操作和常用方法,適合剛接觸C++的初學者。
一、什麼是string類?¶
在C語言中,字符串通常用字符數組(如char str[] = "hello";)表示,需要手動管理內存,且容易出錯。而C++的string類是標準庫的一部分,它封裝了字符串的操作,讓我們可以像處理普通變量一樣處理字符串,無需關心內存分配和越界問題。
要使用string,需要先包含頭文件<string>,並注意命名空間:
#include <string> // 必須包含頭文件
using namespace std; // 或使用 std::string
二、string的定義與初始化¶
1. 直接賦值¶
最簡單的方式是用等號給string變量賦值:
string s1 = "Hello"; // 直接賦值字符串常量
string s2 = s1; // 複製已有字符串
2. 使用構造函數¶
string類提供了多種構造函數,可從字符數組、重複字符等初始化:
string s3("World"); // 從const char*構造
string s4(5, 'A'); // 構造5個'A'的字符串(結果:"AAAAA")
string s5; // 空字符串(長度爲0)
三、字符串的基本操作¶
1. 獲取字符串長度¶
用size()或length()方法獲取長度(兩者效果相同):
string s = "C++";
cout << "長度: " << s.size() << endl; // 輸出:3
cout << "長度: " << s.length() << endl; // 輸出:3
注意:
size()返回的是size_t類型(無符號整數),不是普通整數。
2. 訪問單個字符¶
可以用[]或at()訪問字符:
string s = "hello";
cout << s[0] << endl; // 輸出 'h'(直接訪問,不檢查越界)
cout << s.at(1) << endl; // 輸出 'e'(安全訪問,越界會拋異常)
危險提示:
[]不檢查索引是否合法,若越界可能導致程序崩潰!
3. 字符串連接¶
用+或+=連接字符串,或用append()方法:
string a = "Hello";
string b = " World";
// 方式1:+ 拼接(返回新字符串)
string c = a + b; // c = "Hello World"
// 方式2:+= 拼接(直接修改原字符串)
a += b; // a 變爲 "Hello World"
// 方式3:append() 添加子串
a.append("!"); // a 變爲 "Hello World!"
四、常用成員函數¶
1. 查找子串:find()¶
find()用於查找子串的位置,若找不到返回string::npos(一個極大值):
string s = "abcdefg";
size_t pos = s.find("cd"); // 查找 "cd"
if (pos != string::npos) {
cout << "找到子串,位置:" << pos << endl; // 輸出:2("cd"在第2位,從0開始)
} else {
cout << "未找到子串" << endl;
}
2. 替換子串:replace()¶
從指定位置開始,替換一定長度的字符:
string s = "I like apple";
// 替換從位置2開始的4個字符(原"like")爲"love"
s.replace(2, 4, "love");
cout << s << endl; // 輸出:"I love apple"
3. 插入子串:insert()¶
在指定位置插入字符串:
string s = "Hello";
s.insert(5, " World"); // 在位置5插入" World"
cout << s << endl; // 輸出:"Hello World"
4. 刪除子串:erase()¶
從指定位置開始刪除一定長度的字符:
string s = "Hello World";
s.erase(6, 5); // 從位置6開始刪除5個字符("World")
cout << s << endl; // 輸出:"Hello"
5. 比較字符串:compare()¶
比較兩個字符串,返回:
- 0:相等
- 正數:當前字符串更大
- 負數:當前字符串更小
string a = "apple";
string b = "banana";
cout << a.compare(b) << endl; // 輸出 -1(a < b)
6. 清空字符串:clear()¶
刪除所有字符,字符串變爲空:
string s = "test";
s.clear();
cout << s.size() << endl; // 輸出:0
五、字符串與字符數組的轉換¶
1. string轉const char*¶
用c_str()方法獲取字符串的C風格表示(只讀):
string s = "hello";
const char* cstr = s.c_str(); // 轉換爲const char*
cout << cstr << endl; // 輸出:hello
2. const char*轉string¶
直接用構造函數或賦值:
const char* cstr = "world";
string s(cstr); // 構造string
string s2 = cstr; // 賦值
六、注意事項¶
-
頭文件必須包含:使用
string前需包含<string>頭文件,否則編譯器會報錯。 -
避免混用C風格字符串:不能用
strcpy、strcat等C函數直接操作string,應使用string自帶的方法。 -
size_t類型的陷阱:
size()返回size_t(無符號整數),若與負數比較需注意:
if (s.size() > 0) { ... } // 正確,因爲s.size()不可能爲負
if (s.size() > -1) { ... } // 錯誤!s.size()是無符號,-1會被轉爲極大值,永遠成立
- 空字符串判斷:用
empty()方法判斷是否爲空,比size() == 0更直觀:
if (s.empty()) { ... } // s爲空時執行
七、總結¶
string類是C++中處理字符串的核心工具,掌握它的基本操作和常用方法能極大簡化字符串處理代碼。重點記住:
- 定義與初始化:多種構造方式
- 基本操作:長度、字符訪問、連接
- 常用方法:查找(find)、替換(replace)、插入(insert)、刪除(erase)
多動手實踐示例代碼,就能快速熟悉這些用法!