思路:这题看似只是 普通的字符串替换 的题目,但涉及的细节实在太多,要想做对,必须对字符串剪切、查找、替换相当熟悉。其次,还要想到 用map来实现 关联,难度其实还是很大的。 下面说一下几个用到的函数。
pos = var[i].find(" "); //查找var[i]行 中的空格所在位置,注意分号中间有一个空格
pos1 = var[i].find("{{",pos); //从pos位置处查找"{{",返回其位置
line.substr(0,length); //返回下标0开始length长度的字符
line.substr(pos); //返回下标pos之后的字符
map.count(str); //返回map中是否存在str
str.replace(a,b,c); //用c代替从a开始的b个长度的字符
getline(cin,str[i]); //用来输入一行字符,存进str[i],包括空格。 这里不能用cin>>str[i].因为这样会使空格作为界限,存取字符串
千万要注意的是,在输入字符串之前一定要 cin.ignore(); 这个函数的功能是 忽视前面的一个换行符,不这样的话 会导致换行符作为str[0]的值
#include <iostream> #include <string.h> #include <map> using namespace std; #define MAX 105 int main(){ int n,m,i; cin>>n>>m; string str[MAX]; string var[MAX]; map<string,string>Map; cin.ignore(); //忽略掉上一个回车字符 for(i=0;i<n;i++){ getline(cin,str[i]); //按行存取 } for(i=0;i<m;i++){ getline(cin,var[i]); int pos = var[i].find(" "); Map.insert(map<string,string>::value_type(var[i].substr(0,pos),var[i].substr(pos))); } for(i=0;i<n;i++){ int pos = 0; int pos1,pos2; while(pos<str[i].length()){ pos1 = str[i].find("{{",pos); //从pos开始寻找"{{" pos2 = str[i].find("}}",pos1); if(pos1>=0 && pos2>=0) { //表示找到了 string temp = str[i].substr(pos1+3,pos2-pos1-4); if(Map.count(temp)){ string result = Map[temp].substr(2,Map[temp].length()-3); str[i].replace(pos1,temp.length()+6,result); } else str[i].replace(pos1,temp.length()+6,""); pos = pos1 + temp.length(); } else pos = str[i].length(); } cout<<str[i]<<endl; } return 0; }