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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值