酷代码 AI
菜单
服务商

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]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]