试题编号: | 201509-3 |
试题名称: | 模板生成系统 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 输入格式 输入的第一行包含两个整数 m, n,分别表示模板的行数和模板生成时给出的变量个数。 输出格式 输出包含若干行,表示模板生成的结果。 样例输入 11 2 样例输出 <!DOCTYPE html> 评测用例规模与约定 0 ≤ m ≤ 100 |
问题链接:CCF201509-3 模板生成系统
问题分析:模拟,注意find(),replace()和substr()函数的学习,掌握了这3个函数,解决这道题就比较容易了。
程序说明:C++程序使用getchar()函数要包括cstdio或者stdio.h头文件;回车符对getline()函数会造成影响,因此要考虑吸收多余的回车符,具体看程序。
提交后得100分的C++程序:
#include<iostream>
#include<string>
#include<cstdio>//使用消除空白符的函数getchar()
#include<vector>
#include<map>
using namespace std;
vector<string>res;
map<string,string>d;
void init()
{
res.clear();
d.clear();
string s1,s2;
int n,m;
//读入数据
cin>>m>>n;
getchar();//吸收空白符
while(m--){
getline(cin,s1);
res.push_back(s1);
}
while(n--){
cin>>s1;
getchar();//吸收空白符
getline(cin,s2);
s2.erase(s2.begin()); //去掉前引号
s2.erase(s2.end()-1); //去掉后引号
s1="{{ "+s1+" }}";
d[s1]=s2;
}
}
int main()
{
init();
for(int i=0;i<res.size();i++){//遍历每一行
for(int j=0;j<res[i].size();j++){
int pos1=res[i].find("{{ ",j);//从位置j开始查找 "{{ "
int pos2=res[i].find(" }}",j+3);//从位置j+3开始查找 " }}"
if(pos1==string::npos||pos2==string::npos)
break;
if(pos2>pos1){//如果查找到了
string s=res[i].substr(pos1,pos2+3-pos1);//此为查找到的子串
//字符串res[i]从pos1开始s.length()长的子串替换成d[s]或""
res[i].replace(pos1,s.length(),d.count(s)?d[s]:"");
}
}
}
for(int i=0;i<res.size();i++)
cout<<res[i]<<endl;
return 0;
}