CCF-201403-3-命令行选项
| 试题编号: | 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-命令行选项的更多相关文章
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- Maven学习(四)Maven 命令行选项
说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之 间必须有空格.如下面的例子: $ mvn help:describe -Dcmd=compiler:co ...
- 学习笔记——Maven 命令行选项
2014-10-09:更新裁剪反应堆具体用法 说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之 间必须有空格.如下面的例子: $ mvn help:des ...
- Microsoft Windows Installer 工具 Msiexec.exe 的命令行选项
摘自:http://support.microsoft.com/kb/314881/zh-cn 概要 本文列出了 Windows Installer 工具 Msiexec.exe 的命令行选项.Msi ...
- make的命令行选项
make的命令行选项 -b -m 忽略,提供其它版本make兼容性. -B --always-make 强制重建所有规则的目标,不根据规则的依赖描述决定是否重建目标文件. -C DIR --direc ...
- PhantomJS命令行选项
支持命令行选项有: --help或-h列出所有可能的命令行选项.立即停止,不会运行一个脚本作为参数传递. --version或-v打印的版本PhantomJS.立即停止,不会运行一个脚本作为参数传递. ...
- 【Python】【自动化测试】【pytest】【常用命令行选项】
https://www.cnblogs.com/cnkemi/p/9989019.html http://www.cnblogs.com/cnkemi/p/10002788.html pytest 常 ...
- python 解析命令行选项
问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...
- Ruby 命令行选项
Ruby 命令行选项 Ruby 一般是从命令行运行,方式如下: $ ruby [ options ] [.] [ programfile ] [ arguments ... ] 解释器可以通过下列选项 ...
- CCF真题之命令行选项
201403-3 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母 ...
随机推荐
- Ajax中与服务器的通信【发送请求与处理响应】
一.发送请求 Ajax中通过XMLHttpRequest对象发送异步方式的后台请求时.通常有两种方式的请求,一种是GET请求,另一种是POST请求.发送请求一般要经过4个步骤分别是: (1)初始化XM ...
- IE页面刷新ocx插件被释放,野指针非阻塞Sleep问题。
做一个视频页面,自动化测试的时候崩溃.排查了半天,才发现虚表为NLL,然后调用的已经释放对象里面的函数. 问题出在哪呢?出在了左边的非阻塞Sleep的地方.对象已经释放掉了,但是好在阻塞循环,调用st ...
- 借助csv用PHP生成excel文件
当你将xml文件改为csv后缀会发现原先的表格结构都变成用逗号隔开的一行一行数据,就像这样 编号,姓名,年龄 001,王宇,28 002,刘三,20 由此看来,如果能将PHP数据输出为这样的格式,然后 ...
- Problem G
Problem Description A relay is a race for two or more teams of runners. Each member of a team runs o ...
- 深入分析Android动画(二)
上回书说到Android动画的分类以及基本使用,这会书主要说Android属性动画的原理,对于View动画的原理本篇不做深入分析.对于Android动画的基础请看深入分析Android动画(一) 我们 ...
- 自建梯子教程:vultr+ssr+SwitchyOmega
1 综述 在饱受蓝灯挂掉之苦半个月后,终于决定自己搭建VPS服务器FQ了.虽然网上VPS服务器教程很多,但是我按照那些教程弄好VPS服务器总是不稳定,用着用着就不能用了.这应该是这次GFW升级带来的后 ...
- 原生js实现简单移动端轮播图
最近项目不是很忙,自己就用原生js写了一个简单的移动端轮播图的小demo,可实现自动轮播和手势滑动轮播,然后就把它记录到个人博客里.还有很多不足的地方,希望多多指出,以便改进. 1.代码部分 分为四个 ...
- 2 将mybatis配置到springmvc中
为了更方便的连接数据库,将mybatis配置到springMVC中 1). 首先是jar包 多了3个jar druid 这个是阿里的数据库连接包 mybatis和 mybatis- ...
- 微软Connect(); 2017大会梳理:Azure、数据、AI开发工具
在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure.数据.AI 开发工具的内容.这是第一天的 Connect(); 2017 的主题演讲. 在开场视频中霍金又来了.你记 ...
- C#中的静态成员和非静态成员
C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用上会有什么不同呢? 让我们来看看最直观的差别:使用了static 修饰符的方法为静态方法,反之则是非静态方法 ...