CCF CSP 201403-3 命令行选项
思路:
1.用数组存储某个字母是否应该带有参数、是否在格式字符串中出现过;
2.用getline读取一行字符串,然后用stringstream来以空格为分割拆解字符串;
3.每个字符串判断它是不是合法的,不合法就停止;合法的话判断它有没有参数,参数不合法就停止;
4.用map存储每个选项和它带有的参数,没参数就用空的代替就好了,map会自动排序,最后按序输出即可;
代码:
#include<bits/stdc++.h>
using namespace std;
#define p_b(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
int alpha[26];//字母带参数为1 不带为-1 不存在为0
map<string,string> mp;
bool isLegalOption(string s){
if(s[0]!='-'||s.length()>2) return false;
int pos=s[1]-'a';
if((pos<0&&pos>25)||!alpha[pos]) return false;
return true;
}
bool isLegalPara(string s){
for(auto e:s){
if((!islower(e))&&(!isdigit(e))&&e!='-')
return false;
}
return true;
}
int main(){
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if((i+1)<s.length()&&s[i+1]==':'){
alpha[s[i++]-'a']=1;
}else alpha[s[i]-'a']=-1;
}
int n,kase=1;
cin>>n;
getchar();
rp(i,n){
mp.clear();
string line,item;
getline(cin,line);
stringstream ss(line);
vector<string> v;
while(ss>>item) v.p_b(item);
cout<<"Case "<<kase++<<":";
for(int j=1;j<v.size();j++){ //cout<<v[j]<<"***\n";
if(!isLegalOption(v[j])) break;
if(alpha[v[j][1]-'a']==1){
if((j+1)>=v.size()||!isLegalPara(v[j+1])) break;
mp[v[j]]=v[j+1];
j++;
}else mp[v[j]]=" ";
}
for(auto e:mp){
cout<<' '<<e.first;
if(e.second!=" ") cout<<' '<<e.second;
}
putchar('\n');
}
return 0;
}