提供两种方法,第二种方法简单一点,直接输出
注意:replace 之后,替换后的下标会发生变化
第一种方法借助string处理的方法
#include<iostream>
#include<string>
#include<map>
using namespace std;
int m,n;
string text[105];
map<string,string> mm;
int main()
{
cin>>m>>n;
string key,value;
getchar();
for(int i=0;i<m;i++)
{
getline(cin,text[i]);
// cout<<text[i];
}
int p1,p2;
for(int i=0;i<n;i++)
{
cin>>key;
getline(cin,value);
// cout<<key<<value;
p1=value.find('"');
p2=value.find('"',p1+1);
// cout<<p1<<" "<<p2;
value=value.substr(p1+1,p2-p1-1);
mm.insert({key,value});
}
int xb_begin=0;
int xb_fir,xb_las;
string keyy;
for(int i=0;i<m;i++)
{
xb_begin=0;
xb_fir=text[i].find("{{ ",xb_begin);
while(xb_fir!=string::npos)
{
xb_begin=xb_fir; //!!!
xb_las=text[i].find(" }}",xb_begin);
xb_las+=1;
keyy=text[i].substr(xb_fir+3,xb_las-xb_fir-4);
if(mm.find(keyy)!=mm.end())
text[i].replace(xb_fir,xb_las-xb_fir+2,mm[keyy]);
else text[i].replace(xb_fir,xb_las-xb_fir+2,"");
int size=0;
if(mm.find(keyy)!=mm.end())
size=mm[keyy].size();
xb_begin=xb_fir+size; //!! 见题意不允许递归
xb_fir=text[i].find("{{ ",xb_begin);
}
cout<<text[i]<<endl;
}
return 0;
}
第二种方法:较简单
#include<iostream>
#include<string>
#include<map>
using namespace std;
int m,n;
string text[105];
map<string,string> mm;
int main()
{
cin>>m>>n;
string key,value;
getchar();
for(int i=0;i<m;i++)
{
getline(cin,text[i]);
// cout<<text[i];
}
int p1,p2;
for(int i=0;i<n;i++)
{
cin>>key;
getline(cin,value);
// cout<<key<<value;
p1=value.find('"');
p2=value.find('"',p1+1);
// cout<<p1<<" "<<p2;
value=value.substr(p1+1,p2-p1-1);
mm.insert({key,value});
}
// cout<<endl;
// cout<<mm["name"];
// cout<<mm["email"];
int xb_begin=0;
int xb_fir,xb_las;
string keyy;
for(int i=0;i<m;i++)
{
for(int k=0;k<text[i].size();k++)
{
if(text[i][k]=='{' && text[i][k+1]=='{' && text[i][k+2]==' ')
{
string key;
k+=3;
while(!(text[i][k]==' '&& text[i][k+1]=='}' && text[i][k+2]=='}'))
{
key+=text[i][k];
k++;
}
cout<<mm[key];
k+=2;
}else {
cout<<text[i][k];
}
}
cout<<endl;
}
return 0;
}