【CCF 201403-3】 命令行选项

版权声明: https://blog.csdn.net/leelitian3/article/details/82706709

大致思路

①标记数组记录选项的是否存在和是否带参数

②写三个函数,分别判断 命令名、选项、参数 是否合法

③利用字符串流stringstream处理每一行

④用map<char, string>保存<选项,参数>,若无参数则为空

C++满分代码

#include <bits/stdc++.h>
using namespace std;

string sour,line;
int n;
int letter[26];

bool is_legal_name(string& a)
{
	for(size_t i=0; i<a.length(); ++i)
		if(!islower(a[i])) return 0;
	return 1;
}

bool is_legal_option(string& a)
{
	if(a.size() != 2) return 0;
	if(a[0] != '-') return 0;
	if(!islower(a[1])) return 0;
	if(letter[a[1]-'a'] == 0) return 0;
	return 1;
}

bool is_legal_para(string& a)
{
	for(size_t i=0; i<a.length(); ++i)
		if(!(islower(a[i])||a[i]=='-'||isdigit(a[i]))) return 0;
	return 1;
}

map<char, string> res;
string name, op, pa;
void deal_line()
{
	res.clear();
	stringstream ss(line);
	ss>>name;
	if(is_legal_name(name) == 0) return;
	while(ss>>op)
	{
		if(is_legal_option(op) == 0) return;
		if(letter[op[1]-'a'] == 1) res[op[1]] = "";
		else if(ss>>pa) res[op[1]] = pa;
	}
}

map<char, string>::iterator p;
void print()
{
	for(p = res.begin(); p != res.end(); ++p)
	{
		cout<<" -"<<p->first;
		if(!p->second.empty())
			cout<<" "<<p->second;
	}
}

int main()
{
	cin>>sour;
	for(size_t i=0; i<sour.length(); ++i)
	{
		if(sour[i] == ':') continue;
		else if(i+1<sour.length() && sour[i+1] == ':') letter[sour[i]-'a'] = 2;
		else letter[sour[i]-'a'] = 1;
	}

	cin>>n;
	cin.get();
	for(int i=1; i<=n; ++i)
	{
		cout<<"Case "<<i<<":";
		getline(cin, line);
		deal_line();
		print();
		cout<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/82706709