CCF CSP认证201509-3 模板生成系统(字符串处理)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值