试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
定义结构体option用来存储选项,每个元素有三个flag,分别表示是否在格式字符串中存在,是否带有参数,是否在待处理的命令行中出现,还有一个string,在有参数时存储参数
因为最后结果要求按照字母升序输出该命令行中用到的所有选项的名称,且每个小写字母至多出现一次,所以直接用options[27]来分别存储'a','b',……’z‘的情况
注意"这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理"这句话,估计不是全都由小写字母组成的,,,我判断了这块以后就有样例出错了,所以还是不要判断了
100分代码
#include<iostream>
#include<vector>
using namespace std;
struct option{ //记录所有字母是否出现,是否带参数
int flag1; //标志格式字符串是否有该字符,有=1,无=0
int flag2; //标志是否带参数 带参数=1,不带参数=0
int flag3; //是否在结果中出现
string para; //参数,是由小写字母,数字和减号组成
}options[27];
int judge(string s){
for(int i=0;i<s.length();i++){
if(!((s[i]>='0' && s[i]<='9') || (s[i]>='a' && s[i]<='z') || s[i]=='-')){
return 0;
}
}
return 1;
}
int main(){
string str;
cin>>str;
for(int i=0;i<str.length();i++){
if(i+1<str.length()&&str[i+1]==':'){
options[str[i]-'a'].flag1=1; //格式字符串中有该字符串
options[str[i]-'a'].flag2=1; //可带参数
i++; //跳过冒号
}
else{
options[str[i]-'a'].flag1=1; //格式字符串中有该字符串
options[str[i]-'a'].flag2=0; //不可带参数
}
}
int n;
cin>>n;
// getline(cin,str); //换行符
getchar();
for(int i=1;i<=n;i++){
getline(cin,str);
for(int j=0;j<26;j++){
options[j].flag3=0; //上一条测试样例清零
}
for(int j=0;j<str.length();j++){
if(j==0){ //开头的名字,开头不用判断!!!服了我自己了
for(;j<str.length();j++){
if(str[j]==' ') break;
}
}
else if(str[j]=='-'){ //选项
// 如果- 是一个字符串的最后或者后边是空格,即表示他是单个字符
if((j+2==str.length()-1 ||str[j+2]==' ') && options[str[j+1]-'a'].flag1==1){ //该选项可出现
if(options[str[j+1]-'a'].flag2==1){ //可带参数
string temp=""; //存储参数
int curj=j;
for(j+=3;j<str.length();j++){
if(str[j]==' ') break;
temp+=str[j];
}
if(!judge(temp) || temp==""){
break;
}
options[str[curj+1]-'a'].flag3=1; //在结果中出现
options[str[curj+1]-'a'].para=temp; //参数更新
}
else{ //不带参数
options[str[j+1]-'a'].flag3=1;
j++;
}
}
else{ //出现了不该出现的或者选项里边的字母有多个 不合法
break;
}
}
else if(str[j]==' ');
else { //一个奇奇怪怪本不应存在的字符串
break;
}
}
cout<<"Case "<<i<<":";
int flag4=0; //表示该字符串是否有输出结果
for(int j=0;j<26;j++){
if(options[j].flag3==1){ //在结果中出现
flag4=1;
cout<<" -"<<char('a'+j); //选项
if(options[j].flag2==1){
cout<<" "<<options[j].para; //参数
}
}
}
if(flag4==0){
cout<<" ";
}
cout<<endl;
}
return 0;
}