C++ primer 第五版 中文版 练习 9.43 个人code+github上的代码

C++ primer 第五版 中文版 练习 9.43

题目:编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。
测试你的程序,用它替换通用的简写形式,如,将"tho"替换为"though",将"thru"替换为“through”。


答:

看到这个题目马上想到了用 for跟下标来逐个比较然后替换,但题目要求用 迭代器来实现,马上感觉自己智商余额不足,也不知道是由于受C中数组的影响还是真的智商余额不足……就是用迭代器完成不了,于是乎在 github上找到了一个相关代码如下:

链接:https://github.com/Mooophy/Cpp-Primer/blob/master/ch09/ex9_43.cpp

思路是用substr来生成跟oldVal长度相等的子串,然后比较,相等就把oldVal删除,把newVal插入,然后设置迭代器位置,重新比较。

测试代码如下:以下代码有对源代码的修改,把比较的语句改为了 == 比较,因为在这个练习的时候 compare函数还没有学习到。

/*
编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。
测试你的程序,用它替换通用的简写形式,如,将"tho"替换为"though",将"thru"替换为“through”。
*/

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

void find_replace(string &s, const string &oldVal, const string &newVal)
{
	if (s.empty()||oldVal.empty()||newVal.empty())
	{
		cout << "s or oldVal or newVal字符串为空,请检查" << endl;
		return;
	}
	if (s.size() < oldVal.size())
	{
		cout << "目标字符串长度小于要查找的字符串" << endl;
		return;
	}
	string::iterator iter = s.begin();
	string substring;
	while (iter != s.end())
	{
		if (*iter == *oldVal.begin())
		{
			substring = s.substr(iter - s.begin(), oldVal.size());
			if (substring == oldVal)
			{
				unsigned offSet = iter - s.begin();
				iter = s.erase(iter, iter + oldVal.size());
				s.insert(iter, newVal.begin(), newVal.end());
				iter = s.begin() + offSet + oldVal.size() - 1;
			}

		}
		else
		{
			++iter;
		}
	}
}

int main()
{
	string str = { "mtho my C++ tho,Primer" };
	string oldVal ("tho"), newVal ("though");
	cout << "替换前的字符串为:" << str << endl;
	find_replace(str, oldVal, newVal);

	cout <<"替换后的字符串为:"<< str << endl;

	return 0;
}

执行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值