CCF真题之命令行选项

201403-3

问题描述

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

源代码:

/* 思路:不断的取子串,通过空格再不断的截取字符串,取出命令行选项和参数*/
#include<iostream>
#include<string>
#include<map> //map会自动排序
using namespace std;
int main(){
 int N,i,first,second,index,flag;
 string letters,cmds,tmp,parameter;
 map<string,string> m;
 cin>>letters>>N;
 getline(cin,cmds);
 for(i = 0; i < N; i++){
  getline(cin,cmds);
  first = cmds.find(" ");
  flag=0;
  while(first > 0){
   cmds = cmds.substr(first+1,cmds.length()-first-1);
   second = cmds.find(" ");
   if(second < 0)
   {
    flag=1;
    second = cmds.length();
   }// break;
   
   tmp = cmds.substr(0,second);
   if(tmp.length() == 2 && tmp[0] == ‘-‘){
    index = letters.find(tmp[1]);
    if(index >= 0){    
     if(index+1 < letters.length() &&letters[index+1] == ‘:‘){ //带参数
     if(flag==1) break;//若带参数,输入ls -w,则报错,若无参,输入ls -a,则正确参数
     else
     {
      cmds = cmds.substr(second+1,cmds.length()-second-1);
      second = cmds.find(" ");
      if(second < 0) second = cmds.length();
      parameter = cmds.substr(0,second);
      if(m.count(tmp))//使用count检查map对象中某键是否存在
       m.erase(tmp); //存在,则删除  //处理不重复输出
      m.insert(pair<string,string>(tmp,parameter)); 
     }
     
      //continue;
     }
     else
     {
       if(m.count(tmp))//使用count检查map对象中某键是否存在
       m.erase(tmp); //存在,则删除
        m.insert(pair<string,string>(tmp,"")); //处理不重复输出
     }
     
     first = cmds.find(" "); 
        
    }
    else break; //无这个参数
   }
   else break;  //参数错误
   //first = cmds.find(" ");  
  }
  cout<<"Case "<<i+1<<":";
  map<string,string>::iterator it = m.begin();  //map默认是排好序的
  while(it != m.end()){
   cout<<" "<<it->first;
   if(it->second !="")
    cout<<" "<<it->second;
   ++it;
  }
  cout<<endl;
  m.clear();  
 }
 return 0;
}

时间: 2024-10-12 13:02:39

CCF真题之命令行选项的相关文章

(003)mysqld之命令行选项

十年运维系列之基础篇 - MySQL 作者:曾林 联系:[email protected] 网站:www.jplatformx.com 版权:文章未经同意请勿转载 一.引言 mysqld是MySQL服务器.本小节重点介绍一下mysqld的命令行选项.在介绍之前首先需要明白什么是命令行选项. #mysqld --verbose --help 上表是在linux shell下运行mysqld服务器程序,其中verbose和help就是命令行选项.下表命令完成相同的功能,但是它的命令行选项却是v和?.

make的命令行选项

make的命令行选项 -b -m 忽略,提供其它版本make兼容性. -B --always-make 强制重建所有规则的目标,不根据规则的依赖描述决定是否重建目标文件. -C DIR --directory=DIR 在读取Makefile之前,进入目录“DIR”,就是切换工作目录到“DIR”之后执行make.存在多个“-C”选项时,make的最终工作目录是第一个目录的相对路径.如:“make –C / -C etc”等价于“make –C /etc”.一般此选项被用在递归地make调用中. -

参数传递:传值参数,指针形参,传引用参数,const形参和实参,数组形参,main:处理命令行选项,含有可变形参的函数

重点: 1.每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化. NOTE: 形参初始化的机理与变量初始化一样. 2.形参的类型决定了形参和实参交互的方式. (引用->绑定,非引用->拷贝) 3.实参分为:被引用传递(引用形参是实参的别名),被值传递(实参形参是两个相互独立的对象). 4.传值参数:函数对形参做的所有操作都不会影响实参. 5.指针形参:指针的行为和其他非引用类型一样,当执行指针拷贝操作时,拷贝的是指针的值.拷贝后,两个指针是不同的指针. NOTE: C程序员常常

使用getopts命令解析shell脚本的命令行选项

转自:http://yejinxin.github.io/parse-shell-options-with-getopts-command/ 标准的Unix命令一般都提供很多选项,使用者通过命令行提供具体的选项和参数,格式如下: command -options parameters filename getopts是shell内建的一个命令,它可以帮助我们处理命令行选项,使得我们的脚本也可以与unix命令保持风格一致.getopts的用法格式为: getopts option_string v

shell处理命令行选项getopts

getopts是shell的一个内置命令,通常用来处理shell命令行选项,但是不能直接处理长选项(如:--prefix=/home等). getopts有2个参数,第一个参数是字符串,包括字符和":",每一个字符都是一个有效的选项,如果字符后面带有":",表示这个字符有自己的参数.第二个参数用来存储获取的选项. shell为getopts提供了2个内置变量: OPTARG:存储相应选项的参数: OPTIND:存储原始$*中下一个要处理选项的位置: 实例: #!/b

简单的命令行选项

简单的命令行选项: import sys def main(): if len(sys.argv) != 3: print 'usage: ./wordcount.py {--count | --topcount} file' sys.exit(1) option = sys.argv[1] filename = sys.argv[2] if option == '--count': print_words(filename) elif option == '--topcount': print

python 解析命令行选项

问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指定解析结果被指派给属性的名字 metavar 参数被用来生成帮助信息 action 参数指定跟属性对应的处理逻辑, 通常的值为 store ,将其存储为字符串,action='append'  用来存储某个值或将多个参数值收集到一个列表中 一旦参数选项被指定,你就可以执行 parser.parse(

首届CCF真题3-命令行选项

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

CSP 命令行选项(201403-3)

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