问题描述
试题编号: 201403-3
试题名称: 命令行选项
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一
些不是选项的参数。

  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。

  该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。

  命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
  输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。

  输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。

  接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
  输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出
现了多次,只输出最后一次出现时所带的参数。
样例输入
albw:x

4

ls -a -l -a documents -b

ls

ls -w 10 -x -w 15

ls -a -b -c -d -e -l
样例输出
Case 1: -a -l

Case 2:

Case 3: -w 15 -x

Case 4: -a -b

解题思路:

一直模拟,按照它的规则来写。这里就不赘述了,因为我感觉代码里面的注释已经很详细了。

我没用map,也没有想到用map。直接模拟的,只得到了90分。有大神路过看到博客的话请指点一二,因为我也想拿满分呐。

源代码:

<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; struct node
{
int appear;//该命令是否在格式字符串中出现
int flag;//命令是否在命令行中出现
int appear_parameter;//命令后面是否有参数
string parameter;//最终的命令是什么样子的 }; node ans[26]; void init_ans()
{
for(int i=0;i<26;i++)
{
ans[i].appear=0;//初始化没有在格式字符串中出现
ans[i].flag=0;//默认没有在命令行中出现
ans[i].appear_parameter=0;//初始化都没有命令参数
ans[i].parameter="";//初始化为一个空串
}
} void init_pos()
{
for(int i=0;i<26;i++)
{
ans[i].flag=0;//如果在命令行中出现的话标记为1
ans[i].parameter="";//初始化为一个空串
}
} int main()
{
int num;//判断条数
int k=1;
string s;//格式化字符串
string ss;//需要判断的命令行
cin>>s;
init_ans();
int len_s=s.length();
for(int i=0;i<len_s;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
ans[s[i]-'a'].appear=1;//该命令出现
}
else if(s[i]==':')
{
ans[s[i-1]-'a'].appear_parameter=1;//带有参数
}
}
scanf("%d",&num);
cin.ignore();//读入一个换行符,不然也会算作一个命令的
while(k<=num)
{
getline(cin,ss);
init_pos();
int len_ss=ss.length();
int ss_index=len_ss-1;
while(ss[ss_index]==' ')//考虑一下后面存在多个空格的情况,虽然没有什么用
{
ss_index--;
}
string p=ss.substr(0,ss_index+1);
ss=p;
len_ss=ss.length();
if(len_ss<=2)
{
cout<<"Case "<<k<<": "<<endl;
k++;
continue;
}
ss+=" ";//在最后面加一个空格,方便处理
int l=0;//分割字符串的左边界
int r=0;//分割字符串的右边界
for(int i=0;i<len_ss;i++)
{
if(ss[i]==' ')
{
l=i;
r=i;
r++;
while(ss[r]!=' ')
{
r++;
}
string temp_s=ss.substr(l+1,r-l-1);
//如果截取出来的字符串是一个命令(要绝对保证),不用担心是不是参数,下面判断到了
if(temp_s.length()==2&&temp_s[0]=='-'&&temp_s[1]>='a'&&temp_s[1]<='z')
{
if(ans[temp_s[1]-'a'].appear==0)//该命令没有出现
{
break;
}
else//该命令在格式字符串中出现过
{
if(ans[temp_s[1]-'a'].appear_parameter==0)//正常的命令,并且没有参数
{
ans[temp_s[1]-'a'].flag=1;
i=r-1;
}
else//正常的命令,并且有参数,那就读取下一个是不是参数
{
int ll=r;
int rr=r;
rr++;
while(ss[rr]!=' ')
{
rr++;
}
string temp_ss=ss.substr(ll+1,rr-ll-1);//截取出来一个参数字符串
//判断参数字符串是否符合标准
int flag_parameter=1;//默认符合标准
for(int j=0;j<temp_ss.length();j++)
{
//如果当前字符不是减号,不是小写字母,也不是数字说明不是标准参数
if((temp_ss[j]!='-')&&(temp_ss[j]<'0')&&(temp_ss[j]>'9')&&(temp_ss[j]<'a')&&(temp_ss[j]>'z'))
{
flag_parameter=0;
}
}
if(flag_parameter==0)//不符合参数标准
{
break;
}
else//符合参数标准
{
ans[temp_s[1]-'a'].flag=1;//该命令出现
ans[temp_s[1]-'a'].parameter=temp_ss;//该命令的参数
i=rr-1;
}
}
}
}
else
{
break;//不是正常的命令
}
}
}
string res="";
for(int i=0;i<26;i++)
{
if(ans[i].flag==1)//出现该命令
{
if(ans[i].appear_parameter==0)//无参数类型
{
res+=" ";
res+="-";
res+=i+'a';
}
else//有参数类型
{
res+=" ";
res+="-";
res+=i+'a';
res+=" ";
res+=ans[i].parameter;
}
}
}
cout<<"Case "<<k<<":";
cout<<res<<endl;
k++;
}
return 0;
}</span>

CCF-201403-3-命令行选项的更多相关文章

  1. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  2. Maven学习(四)Maven 命令行选项

    说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之    间必须有空格.如下面的例子: $ mvn help:describe -Dcmd=compiler:co ...

  3. 学习笔记——Maven 命令行选项

    2014-10-09:更新裁剪反应堆具体用法 说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之    间必须有空格.如下面的例子: $ mvn help:des ...

  4. Microsoft Windows Installer 工具 Msiexec.exe 的命令行选项

    摘自:http://support.microsoft.com/kb/314881/zh-cn 概要 本文列出了 Windows Installer 工具 Msiexec.exe 的命令行选项.Msi ...

  5. make的命令行选项

    make的命令行选项 -b -m 忽略,提供其它版本make兼容性. -B --always-make 强制重建所有规则的目标,不根据规则的依赖描述决定是否重建目标文件. -C DIR --direc ...

  6. PhantomJS命令行选项

    支持命令行选项有: --help或-h列出所有可能的命令行选项.立即停止,不会运行一个脚本作为参数传递. --version或-v打印的版本PhantomJS.立即停止,不会运行一个脚本作为参数传递. ...

  7. 【Python】【自动化测试】【pytest】【常用命令行选项】

    https://www.cnblogs.com/cnkemi/p/9989019.html http://www.cnblogs.com/cnkemi/p/10002788.html pytest 常 ...

  8. python 解析命令行选项

    问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...

  9. Ruby 命令行选项

    Ruby 命令行选项 Ruby 一般是从命令行运行,方式如下: $ ruby [ options ] [.] [ programfile ] [ arguments ... ] 解释器可以通过下列选项 ...

  10. CCF真题之命令行选项

    201403-3 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母 ...

随机推荐

  1. LeetCode 485. Max Consecutive Ones (最长连续1)

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  2. LeetCode 153. Find Minimum in Rotated Sorted Array (在旋转有序数组中找到最小值)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  3. 【20171027中】alert(1) to win 第13,14,15,16题

    第13题 题目: function escape(s) { var tag = document.createElement('iframe'); // For this one, you get t ...

  4. ssm框架的整合

    首先创建一个web工程,我这里使用的IDE为eclipse. 结果目录如下: 添加相关的jar包: 接下来是完成配置文件 首先我们先配置web.xml: <?xml version=" ...

  5. SQL&SQLite

    注册博客园有一年多了,每次都是来找点资料,从来没有写过点什么,促使我开始写博客的原因主要有两点 一是在查找资料的过程中,经常需要重复的查找某个知识点,一个知识点时间长了之后总是忘记,这样重复的过程却是 ...

  6. Cycling

    Cycling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. Assigning Workstations

    题目链接:http://vjudge.net/contest/127404#problem/A /* 给你n个数字,让你找出一个最小的数字,这个数字不在这些数字中出现的 ,注意:这个数字如果各个位上的 ...

  8. iOS 中的 Delayed Transition

    Android 的动画体系中,存在一类由 TransitionManager. beginDelayedTransition 管理的动画.这个方法,很特殊.执行此方法后,其后续的 UI 变化,不会立即 ...

  9. JAVAWEB开发环境搭建,附JDK开发环境一键配置批处理bat

    JDK配置: CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar   JAVA_HOME: C:\Program Files\J ...

  10. 深入理解ES6之—set与map

    Set是无重复值的有序列表.Set会自动移除重复的值,因此你可以使用它来过滤数组中重复的值并返回结果. Map是有序的键值对,其中的键允许是任何类型. Set和Map是es6新增的两个数据集合. Se ...