酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

C++ 字符串子串替换实现及开发注意要点

好的,这是一个典型的字符串替换问题。我们来一步步分析并实现它。 ## 🔧 问题分析 我们有两个字符串 `s` 和 `t`,且保证: - `t` 是 `s` 的子串 - `t` 在 `s` 中仅出现一次 要求:将 `s` 中的 `t` 替换为 `***` 并输出。 ## ✅ 实现思路 1. **定位子串位置**:在 `s` 中查找 `t` 第一次(也是唯一一次)出现的位置。 2. **字符串拼接**:将 `s` 分为三部分:`t` 之前的部分 + `***` + `t` 之后的部分。 3. **输出结果**。 ## 📦 C++ 代码实现 | 函数 / 方法 | 用途 | |-------------|------| | `std::string::find()` | 查找子串首次出现的位置 | | `std::string::substr()` | 提取子串 | ```cpp #include <iostream> #include <string> int main() { std::string s, t; // 读入整行,因为在输入中可能包含空格前后的字符串 // 由于两个字符串由空格分隔,直接用 cin 即可 std::cin >> s >> t; // 查找子串 t 在 s 中的位置 size_t pos = s.find(t); if (pos != std::string::npos) { // 替换操作:保留 pos 之前的部分,拼接 "***",再拼接 pos + t.length() 之后的部分 std::string result = s.substr(0, pos) + "***" + s.substr(pos + t.length()); std::cout << result << std::endl; } else { // 根据题意,这种情况不会发生,但为健壮性保留 std::cout << s << std::endl; } return 0; } ``` ## ⚠️ 开发建议与注意事项 1. **输入处理**:如果字符串本身可能包含空格(例如 `s` 或 `t` 由单词组成),建议使用 `getline(cin, s)` 等更灵活的方式,但本题输入格式已定,直接用 `cin >>` 即可。 2. **边界情况**:如果 `t` 出现在 `s` 的开头或末尾,`substr` 的两个调用依然能正确处理(`substr(0,0)` 返回空串,`substr(pos + len)` 当 `pos + len == s.length()` 时也返回空串)。 3. **性能**:`find` 的时间复杂度为 O(n*m)(朴素匹配),对于一般竞赛或面试场景足够。如果字符串极长,可考虑 KMP 算法优化,但本题不必要。 4. **错误处理**:尽管题目保证 `t` 一定出现且仅一次,实际开发中应始终处理 `find` 返回 `npos` 的情况。 ## 🧪 测试样例 **输入:** ``` huanyingxiaohetao xiaohetao ``` **输出:** ``` huanying*** ``` **输入:** ``` hello ll ``` **输出:** ``` he***o ``` ## 📚 相关知识扩展 - **C++ 字符串查找**:`find` 是 `std::string` 的成员函数,另有 `rfind`(从右向左找)、`find_first_of`、`find_last_of` 等。 - **字符串替换**:C++ 标准库没有直接的 `replace_all` 函数,通常自行实现或使用 `std::regex`(但会引入额外开销)。 - **安全提示**:在多线程环境下,如果 `s` 或 `t` 是可变共享数据,需加锁或使用不可变副本。 ######[AI写代码神器 | 852点数解答 | 2026-07-03 19:04:24]

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