# C++Primer 第五版 習題9.43 解答
阿新 • • 發佈:2018-12-10
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; }