更新:更简练的一种做法

  1. 可以用str.find(key)!=string::npos表示str中含有key
  2. 可以用前后加空格的方式避免误改长单词中的key的情况

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main(){
    string str,key,value;
    getline(cin,str);str=" "+str+" ";
    getline(cin,key);key=" "+key+" ";
    getline(cin,value);value=" "+value+" ";
    while(str.find(key)!=string::npos){
        int plot=str.find(key);
        str.erase(plot,key.size()).insert(plot,value);
    }
    cout<<str.substr(1,str.size()-2)<<endl;
    return 0;
}



以下为原题解

基本思路:

while(true):
	找到字符串中第一个key的位置
    将第一个key改成value  

但是可能会出现【找到的key并不是一个单词,而是某个更长的单词的组成部分】的情况。例如,要把read改成write,如果只按照上面的逻辑,会把bread也误改成bwrite。

因此,对每个找到的key,需要检查其是否为独立的单词。如果它不是独立的单词,可以暂时用一个pad单词覆盖(以便于下一次循环可以找到下一个key),等所有的key都改成value之后,再遍历一遍字符串,将所有的pad改成key。

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int isword(string str,int plot,string key){
    int s=0;int e=0;
    if((plot==0)||(str[plot-1]==' '))s=1;
    if(plot+key.size()==str.size()||str[plot+key.size()]==' ')e=1;
    return s&&e;
}

int main(){
    string str,key,value;
    getline(cin,str);
    getline(cin,key);
    getline(cin,value);
    string pad(str.size(),'1');
    int plot=str.find(key);
    while(plot>=0&&plot<str.size()){
        if(!isword(str,plot,key)){
            str.erase(plot,key.size()).insert(plot,pad);
            plot=str.find(key);
            continue;
        }
        str.erase(plot,key.size()).insert(plot,value);
        plot=str.find(key);
    }

    //修改pad为key
    plot=str.find(pad);
    while(plot>=0&&plot<str.size()){
        str.erase(plot,pad.size()).insert(plot,key);
        plot=str.find(pad);
    }

    cout<<str<<endl;
    return 0;
}