C++【STL】string用法擴展
1. assign
:為字符串賦新值
用于替換字符串內容,支持多種參數形式。
常用形式:
// 用另一個字符串賦值
str.assign("Hello World");// 用另一個字符串的子串(從第6個字符開始,取5個字符)
str.assign("Hello World", 6, 5); // 結果:"World"// 用字符數組的前N個字符
str.assign("Hello World", 5); // 結果:"Hello"// 用重復字符填充(重復5次'A')
str.assign(5, 'A'); // 結果:"AAAAA"// 用迭代器范圍
std::string tmp = "Hello";
str.assign(tmp.begin(), tmp.end()); // 結果:"Hello"
2. replace
:替換字符串的某一部分
替換指定位置的字符或子串。
常用形式:
std::string str = "Hello World";// 替換從位置6開始的5個字符為"Universe"
str.replace(6, 5, "Universe"); // 結果:"Hello Universe"// 替換迭代器范圍內的內容
auto start = str.begin() + 6;
auto end = str.begin() + 11;
str.replace(start, end, "Galaxy"); // 結果:"Hello Galaxy"// 用子串替換(替換前3個字符為"Hi")
str.replace(0, 3, "Hi"); // 結果:"Hilo World"// 用重復字符替換(用3個'!'替換前5個字符)
str.replace(0, 5, 3, '!'); // 結果:"!!! World"
3. find
:查找子串或字符的位置
返回第一個匹配的位置,未找到返回 string::npos
。
常用形式:
std::string str = "Hello World";// 查找子串
size_t pos = str.find("World"); // pos = 6// 查找字符
pos = str.find('W'); // pos = 6// 從指定位置開始查找
pos = str.find('l', 3); // 從位置3開始查找,pos = 3(第一個'l'在位置2,但跳過)// 查找字符集合中任意一個字符
pos = str.find_first_of("aeiou"); // 查找第一個元音,pos = 1('e')// 未找到的示例
if (str.find("Moon") == std::string::npos) {std::cout << "未找到子串";
}
在C++中,std::string::substr
用于從字符串中提取子串。以下是其詳細用法和示例:
substr
基本語法
std::string substr(size_t pos = 0, size_t len = npos) const;
- 參數:
pos
:子串的起始位置(默認從0
開始)。len
:子串的長度(默認到字符串末尾)。
- 返回值:新的
std::string
對象,包含提取的子串。
1. 基本提取
std::string str = "Hello World";// 從位置6開始,提取到末尾
std::string sub1 = str.substr(6); // sub1 = "World"// 從位置0開始,提取5個字符
std::string sub2 = str.substr(0, 5); // sub2 = "Hello"// 從位置3開始,提取2個字符
std::string sub3 = str.substr(3, 2); // sub3 = "lo"
2. 處理邊界條件
- 如果
pos
超出字符串長度,會拋出std::out_of_range
異常。 - 如果
len
超出剩余字符數,自動截取到字符串末尾。
std::string str = "Hello";std::string sub1 = str.substr(2, 10); // sub1 = "llo"(len超出實際長度)
// std::string sub2 = str.substr(10); // 拋出異常:pos超出范圍
3. 結合 find
動態截取
std::string str = "user@example.com";// 查找 '@' 的位置,提取用戶名
size_t at_pos = str.find('@');
if (at_pos != std::string::npos) {std::string username = str.substr(0, at_pos); // username = "user"
}// 提取域名部分
std::string domain = str.substr(at_pos + 1); // domain = "example.com"
c_str()
std::string::c_str() 是一個成員函數,用于將 std::string 對象的內容轉換為 C風格字符串(即以空字符 \0 結尾的字符數組)。兼容C語言
#include <string>
#include <cstdio> // 用于 printfint main() {std::string str = "Hello World";const char* cstr = str.c_str();// 與C函數交互(如 printf)printf("C字符串內容: %s\n", cstr); // 輸出: Hello Worldreturn 0;
}
getline
- 從標準輸入讀取一行
#include <iostream>
#include <string>int main() {std::string line;std::cout << "請輸入一行文本:";std::getline(std::cin, line);std::cout << "你輸入的內容是:" << line << std::endl;return 0;
}
輸出示例:
請輸入一行文本:Hello C++ World
你輸入的內容是:Hello C++ World
2. 自定義分隔符
#include <sstream>
#include <string>int main() {std::string data = "Apple,Orange,Banana";std::istringstream iss(data);std::string fruit;// 按逗號分隔讀取while (std::getline(iss, fruit, ',')) {std::cout << "水果:" << fruit << std::endl;}return 0;
}
輸出:
水果:Apple
水果:Orange
水果:Banana
3. 混合使用 >> 和 getline
int main() {int age;std::string name;std::cout << "請輸入年齡:";std::cin >> age; // 輸入后緩沖區殘留換行符// 清除殘留的換行符std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::cout << "請輸入姓名:";std::getline(std::cin, name); // 正確讀取完整姓名(含空格)std::cout << "年齡:" << age << ",姓名:" << name << std::endl;return 0;
}