练习9.43:编写一个函数,接受三个string参数s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用它替换通用的简写形式,如,将“tho”替换为“though”,将“though”。
练习9.44:重写上一题的函数,这次使用一个下标和replace。
然而,看到网上很多人写的解答,觉得这题很简单,但很多人的代码,写的过于简洁,可能没来及考虑全面,比如写了一个我写了一个测试用例“tho tho”这确替换应该为though though, 但实际运行结果却是thougho,也就是newVal把第二个子串覆盖了,解决方案很简单,如果newVal.size() > oldVal.size(), 替换前,先给子串插入(newVal.size()-oldVal.size())个空格, 然后进行替换,当然,也不排除,是我对题目的理解不全面,也许正确做法就是如网上多数人写的那样,这里传上我的代码仅供参考。个人理解不同,勿喷。
/*
*练习9.44
*2015/8/6
*问题描述:练习9.44:重写上一题的函数,这次使用一个下标和replace。
*说明:下面的if用于处理如 “I tho tho tho”,tho替换为though这种情况,大家不妨把那个if注视掉,测试一下,就会明白那个if的意图
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*
*/
#include <iostream>
#include <string>
using namespace std;
void find_replace(string &s,string oldVal, string newVal)
{
auto i = 0;
while(i != s.size())
{
if(s[i] == oldVal[0])
{
string substring = s.substr(i,oldVal.size());
if(substring == oldVal)
{
//这边如果不作处理,在某些测试用例的情况下,有些子串会被覆盖掉,没有达到替换的效果
if(newVal.size() > oldVal.size())
{
//插入 newVal.size()-oldVal.size()个空格,保证替换时,不会发生覆盖的情况。
string temp="";
for(auto i = 0; i != newVal.size()-oldVal.size(); ++i)
temp = temp + " ";
//为替换之前,增加空格,让子串长度和newVal一样长,进行替换,不会覆盖原来的
s.insert(i+oldVal.size(),temp);
}
//大家可以将上面的if注视掉,就知道怎么回事了,根源是,没replace,返回的是s的引用
s.replace(i,newVal.size(),newVal);
}
}
++i;
}
}
int main()
{
string str = "I tho tho athobtho";
find_replace(str,"tho","though");
cout << str << endl;
return 0;
}