题目大意:
输入多个命令行命令,判断输入是否合法。
选项分为两种 1. 带参数的选项,不带参数的选项。
题目细节 :
选项要从小到大排序,同一个选项出现多次,保留最后的参数。
如果选项不合法或者参数不合法则后边的不进行匹配。
带参数选项后边没有参数也是错误的。(10分)
例如 a:
ls -a
题目步骤:
读入字符串之后,各部分分割存入string数组。
从第二个开始遍历,先判断是否为合法选项,如果是,在判断是否为带参选项,如果是,再判断是否为合法参数,存入答案。
对选项排序,输出。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e5+5;
int vis[30];
string k[MAXN];
int tot = 0,tot_op = 0;
struct node
{
bool flag;
string op,val;
}C[MAXN];
int pos[30];
bool cmp(node a,node b)
{
return a.op[1]<b.op[1];
}
bool check(string k)
{
//cout<<k[1]<<endl;
if(!vis[k[1]-'a']||k[0]!='-'||k[1]<'a'|| k[1]>'z'|| k.size()!=2){
return 1;
}
return 0;
}
bool judge(string k)
{
int len =k.size();
for(int i=0;i<len;i++){
if( (k[i]>='a' && k[i]<='z') || (k[i]>='0' && k[i]<='9') || k[i] == '-' )
continue;
else return 1;
}
return 0;
}
int main()
{
string s;
cin>>s;
int len = s.size();
for(int i = 0;i<len;i++){
if(s[i] >= 'a' && s[i]<='z'){
if(s[i+1] == ':'){
vis[s[i]-'a'] = 2;
i++;
}
else vis[s[i]-'a'] = 1;
}
}
int n;
cin>>n;
getchar();
int c = 0;
while(n--){
memset(pos,0,sizeof(pos));
getline(cin,s);
int len = s.size();
tot = 0;
tot_op = 0;
string ss = "";
for(int j=0;j<=len;j++){
if(s[j] == ' ' || j == len){
//cout<<ss<<" * "<<endl;
k[++tot] = ss;
ss = "";
}
else ss += s[j];
}
printf("Case %d:",++c);
for(int i=2;i<=tot;i++){
if(check(k[i])){
break;
}
int now = k[i][1]-'a';
if(vis[now]==2){
if(i==tot || judge(k[i+1])){
break;
}
}
if(!pos[now]){
C[++tot_op].op = k[i];
pos[now] = tot_op;
}
int ps = pos[now];
if(vis[now]==2){
C[ps].flag = 1;
C[ps].val = k[i+1];
i++;
}
else C[ps].flag = 0;
}
sort(C+1,C+1+tot_op,cmp);
for(int i=1;i<=tot_op;i++){
cout<<" "<<C[i].op;
if(C[i].flag){
cout<<" "<<C[i].val;
}
}
cout<<endl;
}
}
/*
albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
*/