C++ string類型基礎:字符串操作與常見方法

在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; // 賦值

六、注意事項

  1. 頭文件必須包含:使用string前需包含<string>頭文件,否則編譯器會報錯。

  2. 避免混用C風格字符串:不能用strcpystrcat等C函數直接操作string,應使用string自帶的方法。

  3. size_t類型的陷阱size()返回size_t(無符號整數),若與負數比較需注意:

   if (s.size() > 0) { ... }  // 正確,因爲s.size()不可能爲負
   if (s.size() > -1) { ... } // 錯誤!s.size()是無符號,-1會被轉爲極大值,永遠成立
  1. 空字符串判斷:用empty()方法判斷是否爲空,比size() == 0更直觀:
   if (s.empty()) { ... }  // s爲空時執行

七、總結

string類是C++中處理字符串的核心工具,掌握它的基本操作和常用方法能極大簡化字符串處理代碼。重點記住:
- 定義與初始化:多種構造方式
- 基本操作:長度、字符訪問、連接
- 常用方法:查找(find)、替換(replace)、插入(insert)、刪除(erase)

多動手實踐示例代碼,就能快速熟悉這些用法!

小夜