幹了這麼多年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!
下次再遇到字符串處理,直接看這份筆記就行,不用再到處查文檔了!記住:多練習才是掌握的關鍵。