C++字符串分割与拼接:提取首尾部分的高效实现
我来帮你实现这个功能。这是一个简单的字符串分割和拼接问题。 ## 🎯 问题分析 题目要求: 1. 输入一个字符串 `s` 和一个分隔符 `c` 2. 字符串中保证只有两个分隔符 3. 需要将字符串按分隔符分割 4. 取出分割后的第一个和最后一个部分进行拼接 5. 输出拼接结果 ## 💻 C++ 实现代码 ```cpp #include <iostream> #include <string> using namespace std; int main() { string s, c; // 读取输入 getline(cin, s); // 读取完整字符串(可能包含空格) getline(cin, c); // 读取分隔符 // 查找第一个分隔符的位置 size_t first_pos = s.find(c); // 查找最后一个分隔符的位置 size_t last_pos = s.rfind(c); // 提取第一个部分(从开头到第一个分隔符) string first_part = s.substr(0, first_pos); // 提取最后一个部分(从最后一个分隔符之后到结尾) string last_part = s.substr(last_pos + c.length()); // 拼接并输出结果 cout << first_part + last_part << endl; return 0; } ``` ## 🔍 代码解释 ### 1. **输入处理** ```cpp getline(cin, s); // 使用 getline 而不是 cin >> 可以处理包含空格的字符串 getline(cin, c); ``` ### 2. **关键函数** - `find()`: 从前往后查找分隔符第一次出现的位置 - `rfind()`: 从后往前查找分隔符最后一次出现的位置 - `substr()`: 提取子字符串 ### 3. **位置计算** ``` 示例:s = "hello-world-test", c = "-" first_pos = 5 (第一个'-'的位置) last_pos = 11 (最后一个'-'的位置) first_part = s.substr(0, 5) = "hello" last_part = s.substr(11 + 1) = "test" 结果 = "hellotest" ``` ## ⚡ 优化版本(更简洁) ```cpp #include <iostream> #include <string> using namespace std; int main() { string s, c; getline(cin, s); getline(cin, c); // 直接查找并拼接 size_t first = s.find(c); size_t last = s.rfind(c); cout << s.substr(0, first) + s.substr(last + c.length()) << endl; return 0; } ``` ## 🧪 测试用例 ### 测试 1 ``` 输入: hello-world-test - 输出: hellotest ``` ### 测试 2 ``` 输入: abc|def|ghi | 输出: abcghi ``` ### 测试 3 ``` 输入: apple orange banana 空格 输出: applebanana ``` ## ⚠️ 注意事项 1. **分隔符长度**:代码考虑了分隔符可能是多个字符的情况(如 `"||"`) 2. **边界情况**: - 如果字符串开头或结尾就是分隔符,代码也能正确处理 - 使用 `size_t` 类型存储位置,避免负数问题 3. **输入处理**:使用 `getline()` 确保能读取包含空格的完整字符串 ## 🚀 性能优化建议 1. **避免不必要的拷贝**:如果不需要修改字符串,可以使用 `string_view`(C++17+) 2. **内存预分配**:如果知道大致长度,可以预先分配内存 3. **输入验证**:实际应用中应验证输入格式 ## 📚 扩展功能 如果需要处理更复杂的情况(如多个分隔符、正则表达式分割等),可以考虑: ```cpp // 使用 stringstream 处理多个分隔符 #include <sstream> #include <vector> vector<string> split(const string& s, char delimiter) { vector<string> tokens; string token; istringstream tokenStream(s); while (getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } ``` ## 💡 开发建议 1. **代码可读性**:变量名要有意义,如 `first_pos` 比 `pos1` 更清晰 2. **错误处理**:实际应用中应检查 `find()` 返回值是否为 `string::npos` 3. **测试覆盖**:考虑各种边界情况,如空字符串、分隔符在开头/结尾等 4. **文档注释**:为函数添加注释说明参数和返回值 ######[AI写代码神器 | 1036点数解答 | 2026-04-11 14:51:15]
- C++ 求解:最少操作次数让字符串无子串 “friend” (字节豆包 | 153点数解答 | 2024-08-17 16:29:54)487
- C++ 求解:最少操作次数让字符串不再含 “friend” 子串!(讯飞星火 | 260点数解答 | 2024-08-17 16:30:49)474
- Python 巧解:最少操作次数让字符串告别“friend”子串(字节豆包 | 139点数解答 | 2024-08-18 13:04:14)412
- 3414 数字游戏:Python 求解 8 位 01 字符串中 1 的个数 (字节豆包 | 106点数解答 | 2024-10-27 14:23:27)438
- 巧用字符添加,计算字符串中“our”最大数量及开发注意要点(DeepSeek | 376点数解答 | 2025-10-30 19:20:06)87
- C 语言实现:处理字符串生成最多 “our” 串,附代码及关键开发注意点 (DeepSeek | 257点数解答 | 2025-10-30 19:20:36)121
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)355
- 巴黎奥运:中国女排淘汰赛对决土耳其,朱婷成致胜关键!(字节豆包 | 448点数解答 | 2024-08-06 15:59:48)171
- Python 代码实现:拼接三个正整数使结果最大及复杂度分析(字节豆包 | 350点数解答 | 2025-12-10 17:53:51)53
- C++:输入字符串拼接感叹号的简洁实现(字节豆包 | 102点数解答 | 2025-12-12 20:25:37)68
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)327
- PHP利用通信证书对请求报文data部分计算p7分离式签名结果数据全流程指南(讯飞星火 | 446点数解答 | 2023-12-07 17:06:14)311