我正在写一个函数,它有三个参数:
target
:目标字符串oldVal
:旧子字符串newVal
:新的子串(替换oldVal)此功能的任务是查找oldVal
字符串中target
的所有出现位置,并将其替换为newVal
。
这是我目前所掌握的功能:
std::string replace_old_with_new(std::string target, std::string oldVal, std::string newVal) {
std::cout << "target : " << target << ", oldVal: " << oldVal << ", newVal: " << newVal << "\n";
std::string::iterator begin = target.begin();
std::string::iterator oldValBegin = oldVal.begin();
while (begin != target.end()) {
if (*begin == *oldValBegin) {
target = target.replace(begin, begin + oldVal.size(), oldVal);
begin = target.begin();
} else {
++begin;
}
}
return target;
}
以下调用上述函数:
replace_old_with_new("Hello! hi hi!", "hi", "bye");
应该返回字符串 -
"Hello! bye bye!"
但是,当我运行代码时,没有任何反应。好像我陷入了无限循环。光标在终端上保持闪烁。我的功能有问题。我认为可能令人不安的是replace
块中的if
调用。这是在replace
函数调用中使用迭代器范围的正确方法吗?我可以使用erase
和insert
执行此操作。但是我想在这里使用replace
。
答案 0 :(得分:3)
字符串比你给予他们的信任要聪明得多。他们知道如何搜索,所以你不必自己动手。
int pos = 0;
int match_pos;
std::string result;
while ((match_pos = target.find(oldVal, pos)) != std::string::npos) {
result += target.substr(pos, match_pos - pos);
result += newVal;
pos = match_pos + target.size();
}
result += target.substr(pos, std::string::npos);
对不起,这是一幅素描;没有经过测试,但你明白了。