CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入

题目分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
来源:acwing

分析:

  1. 本题采用vector< string > 来读入原来模板。接下来的m行需要用到哈希表,进行模板和具体内容的映射。
  2. 遍历vector,如果找到{{,就对后面的字符进行统计,放到变量str中,然后用哈希表中的值替换它,接着输出;如果没有遇到{{,直接输出即可。

本题对笔者稍微有点挑战的地方在于:怎么把m个模板存下来,比如:

name "David Beckham"

name是模板,后面“”里面的内容是具体的值,这东西要怎么读入呢?

这里提供的一种方法是:cin 读入name,后面的 “”中的内容用getchar来读,具体如下:

具体代码如下:


while(m -- ){
 string key, value;
 cin >> key; // 读入前者
 char c;
 //  读掉name 和“” 之间的空格,以及第一个引号
 while(c = getchar(), c != '\"'); 
 // 读入“ ”之间的内容,遇到第二个引号停止读入
 while(c = getchar(), c != '\"') value += c;
 hash[key] = value;
}

ac代码
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m;
vector<string> strs;
unordered_map<string, string> vars;

int main(){
    cin >> n >> m;
    getchar();
    while(n --){
        string str;
        getline(cin, str);
        strs.push_back(str);
    }
    
    while(m --){
        string key, value;
        cin >> key;
        // 使用getline 来读取“”之内的值,存在value中
        char c;
        while( c = getchar(), c!= '\"');
        while( c = getchar(), c!= '\"')  value += c;
        vars[key] = value;
    }
    
    for(auto&  str : strs){
        for(int i = 0; i < str.size();){
            // 找到需要替换的部分
            if( i + 1 < str.size() &&  str[i] == '{' && str[i + 1] == '{'){
                // 跳过{{和空格,所以j+3
                int j = i + 3;
                string key; // 储存待替换的变量,比如name
                while(str[j] != ' ')
                    key  += str[j ++];
                cout << vars[key];
                i = j + 3; // 跳过后面的空格}}
            }
            else cout << str[i ++];
        }
        cout << endl;
    }
}

题目链接

https://www.acwing.com/problem/content/description/3222/

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页