大致思路
①标记数组记录选项的是否存在和是否带参数
②写三个函数,分别判断 命令名、选项、参数 是否合法
③利用字符串流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;
}