C++字符串拼接和分割
一、字符串拼接
字符串拼接的核心需求是把多个不同类型(字符串、数字、字符等)的内容合并成一个字符串,C++ 有多种实现方式。
1. 推荐方式:ostringstream(类型安全,适配所有类型)
这是最通用、最安全的方式,支持任意数据类型拼接,也是 C++ 最佳实践:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <iostream> #include <sstream> #include <string> using namespace std;
template <typename... Args> string concat(Args&&... args) { ostringstream oss; (oss << ... << args); return oss.str(); }
int main() { string name = "小明"; int age = 18; double score = 95.5; char grade = 'A'; string result = concat("姓名:", name, ",年龄:", age, ",成绩:", score, ",等级:", grade); cout << "拼接结果:" << result << endl;
ostringstream oss; oss << "PI = " << 3.1415926 << ",版本:" << 2; cout << oss.str() << endl;
return 0; }
|
2. 基础方式:+ 运算符(仅适用于字符串 / 字符)
适合简单的字符串 / 字符拼接,缺点是不支持数字等其他类型(需先转字符串):
1 2 3 4 5 6 7 8 9
| // 纯字符串/字符拼接 string s1 = "Hello"; string s2 = " World"; char c = '!'; string s3 = s1 + s2 + c; // 结果:Hello World!
// 数字拼接(需先转字符串) int num = 100; string s4 = "数量:" + to_string(num); // 结果:数量:100
|
3. 高效方式:reserve + append(大批量拼接优化)
如果需要拼接大量字符串,先预留内存(reserve)再追加(append),效率远高于反复用 +:
1 2 3 4 5 6 7 8 9
| string big_str;
big_str.reserve(1000);
big_str.append("第一部分"); big_str.append("第二部分"); big_str.append(to_string(12345));
cout << big_str << endl;
|
二、字符串分割
字符串分割的核心是按指定分隔符(如逗号、空格、竖线)把一个字符串拆分成多个子字符串,以下是两种常用方法:
1. 通用方式:stringstream + getline(支持任意单字符分隔符)
这是标准库推荐的方式,适配绝大多数分割场景:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <vector> #include <sstream> #include <string> #include <iostream> using namespace std;
vector<string> split(const string& str, char delimiter) { vector<string> result; stringstream ss(str); string token;
while (getline(ss, token, delimiter)) { if (!token.empty()) { result.push_back(token); } } return result; }
int main() { string str1 = "apple,banana,orange,grape"; vector<string> fruits = split(str1, ','); cout << "按逗号分割结果:" << endl; for (const auto& f : fruits) { cout << "- " << f << endl; }
string str2 = " hello world 123 "; vector<string> words = split(str2, ' '); cout << "\n按空格分割结果:" << endl; for (const auto& w : words) { cout << "- " << w << endl; }
return 0; }
|
2. 进阶方式:find + substr(支持多字符分隔符)
如果分隔符是多个字符(如 ||、--),需要用 find 定位分隔符位置,再用 substr 截取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| vector<string> split_multi(const string& str, const string& delimiter) { vector<string> result; size_t start = 0; size_t end = str.find(delimiter);
while (end != string::npos) { string token = str.substr(start, end - start); if (!token.empty()) { result.push_back(token); } start = end + delimiter.length(); end = str.find(delimiter, start); }
string last_token = str.substr(start); if (!last_token.empty()) { result.push_back(last_token); }
return result; }
int main() { string str = "a||b||c||123||xyz"; vector<string> parts = split_multi(str, "||"); cout << "按多字符分隔符分割:" << endl; for (const auto& p : parts) { cout << "- " << p << endl; } return 0; }
|
三、常见场景整合示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| int main() { ostringstream oss; oss << "张三" << "|" << 25 << "|" << "男" << "|" << 90.5; string user_info = oss.str(); cout << "原始拼接字符串:" << user_info << endl;
vector<string> user_data = split(user_info, '|'); cout << "\n解析结果:" << endl; cout << "姓名:" << user_data[0] << endl; cout << "年龄:" << user_data[1] << endl; cout << "性别:" << user_data[2] << endl; cout << "分数:" << user_data[3] << endl;
string new_info = concat("用户信息:[", user_data[0], "(", user_data[1], "岁)],分数:", user_data[3]); cout << "\n重新拼接结果:" << new_info << endl;
return 0; }
|
总结
- 拼接:优先用
ostringstream(支持所有类型、安全),简单字符串拼接可用 +,大批量拼接用 reserve + append 优化效率。
- 分割:单字符分隔符用
stringstream + getline,多字符分隔符用 find + substr,记得过滤空字符串避免无效数据。
- 核心要点:拼接 / 分割都基于标准库实现,避免手写循环拼接,既保证类型安全,又能适配绝大多数业务场景。