1. 程式人生 > ># C++Primer 第五版 習題9.43 解答

# C++Primer 第五版 習題9.43 解答

C++Primer 第五版 習題9.43 解答

**練習9.43:**編寫一個函式,接受三個string引數s,oldVal和newVal。使用迭代器及insert和erase函式將s中所有oldVal替換為newVal。測試你的程式,用它替換通用的簡寫形式,如,將“tho”替換為“though”,將“though”。

一開始想用迭代器來做這個題,寫到一半才發現迭代器在使用insert和erase有太多的不方便了,貌似string的insert和erase並不像vector的,vector這兩個函式返回的就是新的迭代器,而string的是返回當前字串的引用,因此迭代器的更新是十分麻煩的事情,下面主要使用string的find()查詢字串與下標搜尋的方式來完成的。

上程式碼

#include<iostream>
#include <string>
using namespace std;
void ReplaceSubstr(string &s, string oldVal, string newVal);
void ReplaceSubstr(string &s, string oldVal, string newVal)//這裡s必須串引用,不然執行完函式後s無法更新
{
	if (s.empty() || oldVal.empty() || newVal.empty())
	{
		cout << "s or oldVal or newVal字串為空,請檢查" << endl;
		return;
	}
	if (s.size() < oldVal.size())
	{
		cout << "目標字串長度小於要查詢的字串" << endl;
		return;
	}

	int pos = 0;

		while (pos<=s.size()-oldVal.size())
		{
			int curp=s.substr(pos,s.size()-pos).find(oldVal);//這裡必須要將curp定義成整形,否則不能返回在字串中的位置
			if (curp != -1)//找到了
			{
				s.erase(pos+curp, oldVal.size());
				s.insert(pos+curp, newVal);
				pos = pos + newVal.size();
			}
			else
			{
				pos += 1;
			}
		}
		return;
}

int main(void)
{
	string s("thoABC AthruXYY");
	string s1("thru");
	string s2("through");
	ReplaceSubstr(s, s1, s2);
	cout << s<<endl;
	return 0;
}