请改写后面这个函数int replace(char* str, char* old, char* New),使其能够应对各种边界值以及特殊情况,不能引用库函数
时间: 2024-11-12 22:38:13 浏览: 3
原始函数`replace()`需要考虑一些边缘情况和异常处理,例如输入字符串为空、旧字符数组长度为0、新字符数组过长导致替换失败等。以下是修改后的版本:
```cpp
#include <string.h> // 需要这个头文件来获取strlen(),但这里只用于演示目的
// 为了兼容C++,将函数声明为返回大小_t,而不是int,并添加const修饰符以防止修改原字符串
size_t safe_replace(char* const str, size_t str_len, const char* old, const char* new_str) {
if (str == nullptr || str_len == 0 || old == nullptr) { // 检查边界条件
return str_len; // 如果任何一个参数无效,直接返回原长度
}
if (new_str == nullptr) { // 新字符串为空时不做替换
return str_len;
}
size_t old_len = strlen(old); // 获取旧字符串长度
if (old_len == 0) { // 如果旧字符串为空,无事可做
return str_len;
}
size_t new_len = strlen(new_str);
size_t pos = 0;
while ((pos = strnstr(str + pos, old, str_len - pos)) != nullptr) { // 使用strnstr代替strchr以避免溢出
size_t new_start = pos + old_len;
if (new_start >= str_len) { // 如果旧字符串超出范围,跳出循环
break;
}
memmove(str + new_start, str + new_start + old_len, str_len - new_start); // 移动剩余部分
memcpy(str + pos, new_str, new_len); // 替换旧字符串
str_len += new_len - old_len; // 更新字符串长度
pos += new_len; // 跳到新位置继续查找
}
return str_len; // 返回最终替换后的新长度
}
阅读全文