问题描述
  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-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

  1. #include<iostream>
  2. #include<map>
  3. #include<string>
  4. #include<cstring>
  5. using namespace std;
  6. struct Sel{
  7. string sname; //选项名
  8. int isS; //是否为该命令行工具接受的选项
  9. int hasP; //此选项是否有参
  10. int isI; //是否为此次命令出现过的选项
  11. string pname;
  12. };
  13. struct Sel sel[];
  14. void setSel(){ //初始化选项
  15. char c[];
  16. c[]='-';
  17. string s="-a";
  18. for(int i=;i<;i++){
  19. char c='a'+i;
  20. s.replace(,,,c);
  21. sel[i].sname=s;
  22. sel[i].isS=;
  23. sel[i].hasP=;
  24. sel[i].isI=;
  25. }
  26. }
  27. void reSelI(){ //重置是否为此次输入命令的标记位
  28. for(int i=;i<;i++) sel[i].isI=;
  29. }
  30. void printSel(){ //每次的命令结果输出
  31. for(int i=;i<;i++){
  32. if(sel[i].isI){
  33. cout<<sel[i].sname;
  34. cout<<" ";
  35. if(sel[i].hasP){
  36. cout<<sel[i].pname;
  37. cout<<" ";
  38. }
  39. }
  40. }
  41. cout<<endl;
  42. }
  43. void split(char *src, const char *separator, char **dest, int *num) //字符分割
  44. {
  45. char *pNext;
  46. int count = ;
  47.  
  48. if (src == NULL || strlen(src) == ) return;
  49. if (separator == NULL || strlen(separator) == ) return;
  50.  
  51. pNext = strtok(src,separator);
  52.  
  53. while(pNext != NULL)
  54. {
  55. *dest++ = pNext;
  56. ++count;
  57. pNext = strtok(NULL,separator);
  58. }
  59.  
  60. *num = count;
  61. }
  62. int isSel(char *src){ //判断是不是正确的选项 -a,-b,-c...-z
  63. for(int i=;i<;i++){
  64. if(strcmp(src,sel[i].sname.c_str())==){
  65. if(sel[i].isS){
  66. sel[i].isI=;
  67. return i;
  68. }
  69. }
  70. }
  71. return -;
  72. }
  73. int main(){
  74. string ins;
  75. cin>>ins;
  76. setSel();
  77. for(int i=;i<ins.length();i++){ //输入处理
  78. sel[ins.at(i)-'a'].isS=;
  79. if(i+<ins.length()&&ins.at(i+)==':'){
  80. sel[ins.at(i)-'a'].hasP=;
  81. ++i;
  82. }
  83. }
  84. int n;
  85. cin>>n;
  86. char command[];
  87. char *dest[];
  88. getchar();
  89. for(int i=;i<n;i++){
  90. cin.getline(command,);
  91. int num=;
  92. split(command," ",dest,&num);
  93. for(int j=;j<num;j++){
  94. int compare=isSel(dest[j]);
  95. if(compare!=-){
  96. if(sel[compare].hasP){
  97. if(j+==num) break; //判断带参数得选项是不是最后一个字符串,即后面是否有参数
  98. sel[compare].pname=dest[++j];
  99. }
  100. }
  101. else break;
  102. }
  103. cout<<"Case "<<(i+)<<": ";
  104. printSel();
  105. reSelI();
  106. }
  107. return ;
  108. }

CSP 命令行选项(201403-3)的更多相关文章

  1. 命令行选项解析函数(C语言):getopt()和getopt_long()

    命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...

  2. NUnit-Console 命令行选项详解

    本文为 Dennis Gao 原创或翻译技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. NUnit-Console 命令行选项 NUnit-Console 命令行选项列表 指定运行哪 ...

  3. python argparse模块解析命令行选项简单使用

    argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...

  4. argparse - 命令行选项与参数解析(转)

    argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...

  5. 命令行选项 - Mozilla 产品与私有技术 | MDN - Google Chrome

    命令行选项 在本文章中 语法规则 使用命令行选项 示例 用户配置档 -CreateProfile profile_name -CreateProfile "profile_name prof ...

  6. LoadRunner 11安装Micosoft Visual C++ 2005 SP1时提示命令行选项语法错误

    如果安装LoadRunner 11时弹窗提示"Micosoft Visual C++ 2005 SP1 可再发行组件包(X86):'命令行选项语法错误.键入命令 / ? 可获得帮助信息'&q ...

  7. pytest 常用命令行选项(二)

    本文接上篇继续简介pytest常用的命令行选项. 8.-v(--verbose) 选项 使用-v/--verbose选项,输出的信息会更详细.最明显的区别就是每个文件中的每个测试用例都占一行,测试的名 ...

  8. pytest 常用命令行选项(一)

    pytest有丰富的命令行选项,以满足不同的需要,下面对常用的命令行选项作下简单介绍.  上文已经使用过-v选项,还有很多选项,你可以使用pytest --help查看全部选项.如下图: 1.--co ...

  9. 安装loadrunner时出现”命令行选项语法错误键入命令 \?获得帮助“的解决方法

    安装LR11 时,安装Microsoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入“命令/?”可获取帮肋信息1.进入loadrunner-11\Addition ...

  10. 详解Top命令 输出命令行选项及代码

    Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运 ...

随机推荐

  1. MySQL_(Java)使用preparestatement解决SQL注入的问题

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...

  2. docker之CPU配额参数的混合使用

    在启动容器的时候有很多参数,这里来实践一下与CPU相关的参数. 实例: 创建两个容器,docker10.docker20,让两个容器只运行在CPU0上,然后测试CPU使用率. [root@openst ...

  3. [CSP-S模拟测试]:Weed(线段树)

    题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...

  4. LeetCode 6. Z字形变换(ZigZag Conversion)

    题目描述 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"P ...

  5. 【实用软件】GIF屏幕录制软件-ScreenToGif (在GitHub开源)

    抛个问题,自问自答 ScreenToGif 经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚某个动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快 ...

  6. EBS AP 创建会计科目失败

    路径:应付款系统管理员/发票/发票 问题描述: 在AP发票界面录入一笔发票,验证发票,撤销发票,然后在AP发票界面的“活动”中创建会计科目,发现带出的并发请求“创建会计科目”正常跑完,但是通过“报表/ ...

  7. rocketmq的以集群模式MessageModel.CLUSTERING实现消费者集群消费消息,实现负载均衡

    package com.bfxy.rocketmq.model; import java.util.List; import org.apache.rocketmq.client.consumer.D ...

  8. HTML页面间传值

    页面一: window.location="./showUserMsg.html?IDno="+IDno+"&&thedate="+thedat ...

  9. LC 963. Minimum Area Rectangle II

    Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...

  10. 数据库报错:OracleDialect does not support identity key generation

    当我把数据库改为oracle时,项目报错:org.hibernate.MappingException: org.hibernate.dialect.OracleDialect does not su ...