您的位置:首页 > 其它

CCF 201403-3 命令行选项 (恶心的模拟)

2015-09-04 20:13 330 查看
问题描述
  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。

  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-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

一开始用二维数组做,一直卡在70分,不清楚哪儿没考虑到。后面参考了别人的代码,改用map来搞了。

坑点:

1、要处理的命令行中会出现 -abc这种选项,当然这是不合法的

2、样例中已经出现:即只含有一个工具名的情况(case2)以及既不是含有'-'的选项,也不是合法参数(case1)。

3、参数不一定就是数字

4、最后输出要排一下序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
char s[300];
map<char,int> o,a;
map<char,string> m;
int main()
{
    cin>>s;
    int i,j,n;
    for(i=0;s[i]!=0;++i)
        if(s[i]==':') o[s[i-1]]++;
        else o[s[i]]++;
    cin>>n;
    getchar();
    for(i=1;i<=n;++i)
    {
        a.clear();
        m.clear();
        gets(s);
        printf("Case %d:",i);
        for(j=1;s[j]!=' '&&s[j]!=0;++j);
        if(s[j]==0) {puts("");continue;}
        while(s[j]!=0)
        {
            if(s[++j]!='-') break;
            if(o[s[++j]]==0) break;
            if(o[s[j]]==1)
            {
                if(s[j+1]==' '||s[j+1]==0) a[s[j++]]=1;
                else break;
            }
            else if(s[j+1]==' '&&s[j+2]!=0)
            {
                a[s[j]]=2;
                string tmp="";
                int tm=j;
                for(j=j+2;s[j]!=0&&s[j]!=' ';++j) tmp+=s[j];
                m[s[tm]]=tmp;
            }
            else break;
        }
        map<char,int>::iterator it;
        for(it=a.begin();it!=a.end();++it)
        {
            cout<<" -"<<it->first;
            if(it->second==2) cout<<' '<<m[it->first];
        }
        puts("");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: