201509-3 模板生成系统
题目
思路
string数组保存标记,map存储变量名和变量值。
注意replace之后字符串的长度就变了,我第一次提交的时候把s1赋为s2出错了80分。
AC代码如下
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
using namespace std;
string t[105];
map<string,string> var;
int main(){
int n,m;
cin>>n>>m;
cin.get();//吃回车
for(int i=0;i<n;i++){
getline(cin,t[i]);
}
string a,b;
for(int i=0;i<m;i++){
getline(cin,b);//由于变量值可能中间有空格,所以需要用getline读一整行
int s=b.find(" ");
a=b.substr(0,s);
a=" "+a+" ";//这里我把变量两边的空格加上去了
b=b.substr(s+2,b.size()-s-3);//去引号
var[a]=b;
}
for(int i=0;i<n;i++){
int s1=0,s2=0;
while(1){//在一行模板内不断找标量标记
s1=t[i].find("{{",s1);
if(s1==string::npos) break;//找不到标记了,退出
s2=t[i].find("}}",s1);
if(s2==string::npos) break;
string temp=t[i].substr(s1+2,s2-s1-2);//把变量名抽出来
if(var.find(temp)==var.end()){//变量未定义
t[i].erase(s1,s2-s1+2);
} else {
t[i].replace(s1,s2-s1+2,var[temp]);
s1+=var[temp].size();//新的起点需要越过刚刚的变量,避免递归替换
//最开始我令s1=s2,出错了
}
}
cout<<t[i]<<endl;
}
return 0;
}