CSP 命令行选项(201403-3)
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b
#include<iostream>
#include<map>
#include<string>
#include<cstring>
using namespace std;
struct Sel{
string sname; //选项名
int isS; //是否为该命令行工具接受的选项
int hasP; //此选项是否有参
int isI; //是否为此次命令出现过的选项
string pname;
};
struct Sel sel[];
void setSel(){ //初始化选项
char c[];
c[]='-';
string s="-a";
for(int i=;i<;i++){
char c='a'+i;
s.replace(,,,c);
sel[i].sname=s;
sel[i].isS=;
sel[i].hasP=;
sel[i].isI=;
}
}
void reSelI(){ //重置是否为此次输入命令的标记位
for(int i=;i<;i++) sel[i].isI=;
}
void printSel(){ //每次的命令结果输出
for(int i=;i<;i++){
if(sel[i].isI){
cout<<sel[i].sname;
cout<<" ";
if(sel[i].hasP){
cout<<sel[i].pname;
cout<<" ";
}
}
}
cout<<endl;
}
void split(char *src, const char *separator, char **dest, int *num) //字符分割
{
char *pNext;
int count = ; if (src == NULL || strlen(src) == ) return;
if (separator == NULL || strlen(separator) == ) return; pNext = strtok(src,separator); while(pNext != NULL)
{
*dest++ = pNext;
++count;
pNext = strtok(NULL,separator);
} *num = count;
}
int isSel(char *src){ //判断是不是正确的选项 -a,-b,-c...-z
for(int i=;i<;i++){
if(strcmp(src,sel[i].sname.c_str())==){
if(sel[i].isS){
sel[i].isI=;
return i;
}
}
}
return -;
}
int main(){
string ins;
cin>>ins;
setSel();
for(int i=;i<ins.length();i++){ //输入处理
sel[ins.at(i)-'a'].isS=;
if(i+<ins.length()&&ins.at(i+)==':'){
sel[ins.at(i)-'a'].hasP=;
++i;
}
}
int n;
cin>>n;
char command[];
char *dest[];
getchar();
for(int i=;i<n;i++){
cin.getline(command,);
int num=;
split(command," ",dest,&num);
for(int j=;j<num;j++){
int compare=isSel(dest[j]);
if(compare!=-){
if(sel[compare].hasP){
if(j+==num) break; //判断带参数得选项是不是最后一个字符串,即后面是否有参数
sel[compare].pname=dest[++j];
}
}
else break;
}
cout<<"Case "<<(i+)<<": ";
printSel();
reSelI();
}
return ;
}
CSP 命令行选项(201403-3)的更多相关文章
- 命令行选项解析函数(C语言):getopt()和getopt_long()
命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...
- NUnit-Console 命令行选项详解
本文为 Dennis Gao 原创或翻译技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. NUnit-Console 命令行选项 NUnit-Console 命令行选项列表 指定运行哪 ...
- python argparse模块解析命令行选项简单使用
argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...
- argparse - 命令行选项与参数解析(转)
argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...
- 命令行选项 - Mozilla 产品与私有技术 | MDN - Google Chrome
命令行选项 在本文章中 语法规则 使用命令行选项 示例 用户配置档 -CreateProfile profile_name -CreateProfile "profile_name prof ...
- LoadRunner 11安装Micosoft Visual C++ 2005 SP1时提示命令行选项语法错误
如果安装LoadRunner 11时弹窗提示"Micosoft Visual C++ 2005 SP1 可再发行组件包(X86):'命令行选项语法错误.键入命令 / ? 可获得帮助信息'&q ...
- pytest 常用命令行选项(二)
本文接上篇继续简介pytest常用的命令行选项. 8.-v(--verbose) 选项 使用-v/--verbose选项,输出的信息会更详细.最明显的区别就是每个文件中的每个测试用例都占一行,测试的名 ...
- pytest 常用命令行选项(一)
pytest有丰富的命令行选项,以满足不同的需要,下面对常用的命令行选项作下简单介绍. 上文已经使用过-v选项,还有很多选项,你可以使用pytest --help查看全部选项.如下图: 1.--co ...
- 安装loadrunner时出现”命令行选项语法错误键入命令 \?获得帮助“的解决方法
安装LR11 时,安装Microsoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入“命令/?”可获取帮肋信息1.进入loadrunner-11\Addition ...
- 详解Top命令 输出命令行选项及代码
Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运 ...
随机推荐
- Vue_(基础)Vue中的事件
Vue.js中文文档 传送门 Vue@事件绑定 v-show:通过切换元素的display CSS属性实现显示隐藏: v-if:根据表达式的真假实现显示隐藏,如果隐藏,它绑定的元素都会销毁,显示的时候 ...
- R-seq()
seq(0, 1, length.out = 11) > seq(0, 1, length.out = 11) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0 ...
- PHP ob_get_level嵌套输出缓冲
PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). ob_level1.png手册说明如下: ob_get_l ...
- Linux 常用命令之df du
1.du 命令:显示每个文件或目录的磁盘使用空间 1) du -h --max-depth [root@ip101 app]# pwd /opt/app [root@ip101 app]# du -h ...
- 一、基础篇--1.2Java集合-HashMap和HashSet的区别
HashMap和HashSet的区别 1.HashMap实现的是Map接口,HashSet实现的是Set接口 2.结构不一样,一个存储的是键值对,一个存储的是对象 3.HashMap存储的值可能相同 ...
- JPEG格式 介绍
JPEG格式 jpeg是有损压缩格式, 将像素信息用jpeg保存成文件再读取出来,其中某些像素值会有少许变化.在保存时有个质量参数可在[0,100]之间选择,参数越大图片就越保真,但图片的体积也就越大 ...
- centos7.2 安装nginx+php
Nginx的安装 安装快速HTTP服务器“的Nginx”并配置HTTP服务器# install from EPEL [root@linuxprobe~]# yum --enablerepo=epel ...
- vscode+python+flake8+cmder配置
{ "window.zoomLevel": 0, "[python]": {}, "kite.showWelcomeNotif ...
- [转]Cookie详解
从事 Web 开发已有近17个月:在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感-差不多是了解一二,然而又非真切的明晰:这就使得再用的时候,总要去再搜索一番:如此颇为难受,倒不 ...
- 【SQL】MySQL---using的用法
学习记录: mysql中using的用法为: using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件