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;
// 折叠表达式(C++17及以上),依次写入所有参数
(oss << ... << args);
return oss.str();
}

int main() {
// 示例1:拼接字符串+整数+浮点数+字符
string name = "小明";
int age = 18;
double score = 95.5;
char grade = 'A';

string result = concat("姓名:", name, ",年龄:", age, ",成绩:", score, ",等级:", grade);
cout << "拼接结果:" << result << endl;
// 输出:姓名:小明,年龄:18,成绩:95.5,等级:A

// 示例2:基础拼接(无模板,新手友好)
ostringstream oss;
oss << "PI = " << 3.1415926 << ",版本:" << 2;
cout << oss.str() << endl; // 输出:PI = 3.1415926,版本:2

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; // 输出:第一部分第二部分12345

二、字符串分割

字符串分割的核心是按指定分隔符(如逗号、空格、竖线)把一个字符串拆分成多个子字符串,以下是两种常用方法:

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() {
// 示例1:按逗号分割
string str1 = "apple,banana,orange,grape";
vector<string> fruits = split(str1, ',');
cout << "按逗号分割结果:" << endl;
for (const auto& f : fruits) {
cout << "- " << f << endl; // 依次输出 apple、banana、orange、grape
}

// 示例2:按空格分割(处理多空格)
string str2 = " hello world 123 ";
vector<string> words = split(str2, ' ');
cout << "\n按空格分割结果:" << endl;
for (const auto& w : words) {
cout << "- " << w << endl; // 依次输出 hello、world、123
}

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; // 依次输出 a、b、c、123、xyz
}
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() {
// 1. 拼接:生成带分隔符的字符串
ostringstream oss;
oss << "张三" << "|" << 25 << "|" << "男" << "|" << 90.5;
string user_info = oss.str();
cout << "原始拼接字符串:" << user_info << endl; // 输出:张三|25|男|90.5

// 2. 分割:解析拼接后的字符串
vector<string> user_data = split(user_info, '|');
cout << "\n解析结果:" << endl;
cout << "姓名:" << user_data[0] << endl; // 张三
cout << "年龄:" << user_data[1] << endl; // 25
cout << "性别:" << user_data[2] << endl; // 男
cout << "分数:" << user_data[3] << endl; // 90.5

// 3. 重新拼接:调整格式
string new_info = concat("用户信息:[", user_data[0], "(", user_data[1], "岁)],分数:", user_data[3]);
cout << "\n重新拼接结果:" << new_info << endl;
// 输出:用户信息:[张三(25岁)],分数:90.5

return 0;
}

总结

  1. 拼接:优先用 ostringstream(支持所有类型、安全),简单字符串拼接可用 +,大批量拼接用 reserve + append 优化效率。
  2. 分割:单字符分隔符用 stringstream + getline,多字符分隔符用 find + substr,记得过滤空字符串避免无效数据。
  3. 核心要点:拼接 / 分割都基于标准库实现,避免手写循环拼接,既保证类型安全,又能适配绝大多数业务场景。