幹了這麼多年C++,每次處理字符串還得查文檔,真是説不過去!今天我決定把這些常用的字符串操作函數背下來,整理成這份速記指南。

在C++中,字符串操作主要依賴於 <string> 頭文件。掌握字符串處理是C++編程中的核心技能之一。


必須掌握的頭文件

#include <string>    // 主要頭文件
#include <iostream>  // 用於輸入輸出
#include <sstream>   // 字符串流處理
#include <algorithm> // 用於字符串算法

必須掌握的字符串操作

1. 字符串創建和初始化

string str1;                    // 空字符串
string str2 = "Hello";         // 直接初始化
string str3("World");          // 構造函數初始化
string str4(5, 'A');           // "AAAAA"
string str5 = str2 + " " + str3; // 字符串拼接

2. 獲取字符串信息

int len = str.length();        // 字符串長度
int size = str.size();         // 同length()
bool empty = str.empty();      // 是否為空

3. 訪問字符串內容

char first = str[0];           // 通過下標訪問
char first_safe = str.at(0);   // 安全訪問,會檢查邊界
char last = str.back();        // 最後一個字符
char first_char = str.front(); // 第一個字符

4. 字符串查找

size_t pos = str.find("hello");    // 查找子串
size_t rpos = str.rfind("hello");  // 從後往前查找
size_t found = str.find_first_of("aeiou");  // 查找任意匹配字符
size_t notfound = str.find_first_not_of("0123456789"); // 查找非數字字符

5. 字符串修改

str.append(" World");          // 追加字符串
str.push_back('!');            // 追加單個字符
str.insert(5, " Beautiful");   // 在指定位置插入
str.erase(5, 10);              // 刪除從位置5開始的10個字符
str.replace(0, 5, "Hi");       // 替換從位置0開始的5個字符

6. 字符串比較

bool equal = (str1 == str2);   // 直接比較
int result = str1.compare(str2); // 返回0表示相等,<0表示str1小,>0表示str1大
bool starts = str.starts_with("Hello"); // C++20 檢查前綴
bool ends = str.ends_with("World");     // C++20 檢查後綴

7. 子串操作

string sub = str.substr(0, 5);     // 從位置0開始取5個字符
string sub2 = str.substr(6);       // 從位置6開始到結尾

8. 字符串轉換

// 數字轉字符串
string num_str = to_string(123);

// 字符串轉數字
int num = stoi("456");
double d = stod("3.14");
long l = stol("1000000");

// 大小寫轉換
transform(str.begin(), str.end(), str.begin(), ::tolower);
transform(str.begin(), str.end(), str.begin(), ::toupper);

9. 字符串流處理

// 字符串分割
stringstream ss("apple,banana,orange");
string item;
while (getline(ss, item, ',')) {
    cout << item << endl;
}

// 格式化字符串
stringstream ss2;
ss2 << "Name: " << name << ", Age: " << age;
string result = ss2.str();

10. 字符串清理和修剪

// 去除前後空格(自定義函數)
string trim(const string& str) {
    size_t start = str.find_first_not_of(" \t\n\r");
    size_t end = str.find_last_not_of(" \t\n\r");
    return (start == string::npos) ? "" : str.substr(start, end - start + 1);
}

常用模式速記

1. 字符串分割

vector<string> split(const string& str, char delimiter) {
    vector<string> tokens;
    stringstream ss(str);
    string token;
    while (getline(ss, token, delimiter)) {
        tokens.push_back(token);
    }
    return tokens;
}

2. 字符串替換

string replace_all(string str, const string& from, const string& to) {
    size_t start_pos = 0;
    while ((start_pos = str.find(from, start_pos)) != string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length();
    }
    return str;
}

3. 檢查字符串內容

bool is_number(const string& str) {
    return !str.empty() && all_of(str.begin(), str.end(), ::isdigit);
}

bool contains(const string& str, const string& substring) {
    return str.find(substring) != string::npos;
}

完整示例:綜合字符串操作

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    // 創建和初始化
    string text = "Hello World, Welcome to C++ Programming!";
    
    // 基本信息
    cout << "長度: " << text.length() << endl;
    cout << "是否為空: " << text.empty() << endl;
    
    // 查找
    size_t pos = text.find("C++");
    if (pos != string::npos) {
        cout << "找到C++在位置: " << pos << endl;
    }
    
    // 修改
    text.replace(pos, 3, "Python");
    cout << "替換後: " << text << endl;
    
    // 大小寫轉換
    transform(text.begin(), text.end(), text.begin(), ::tolower);
    cout << "小寫: " << text << endl;
    
    // 字符串分割
    string data = "apple,banana,orange,grape";
    stringstream ss(data);
    string fruit;
    cout << "水果列表: ";
    while (getline(ss, fruit, ',')) {
        cout << fruit << " ";
    }
    cout << endl;
    
    return 0;
}

速記口訣

字符串,<string> 頭;
創建拼接最常用;
查找用 find,替換用 replace
流處理,分割強;
大小寫,transform


下次再遇到字符串處理,直接看這份筆記就行,不用再到處查文檔了!記住:多練習才是掌握的關鍵。