SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

CCF-CSP:201403-3命令行选项

发表于 2020-01-27 更新于 2021-10-29 分类于 计算机 , 算法题 , CCF-CSP 阅读次数: Valine:
本文字数: 3.2k 阅读时长 ≈ 3 分钟

CCF-CSP题目汇总

题目

试题编号: 201403-3
试题名称: 命令行选项
时间限制: 1.0s
内存限制: 256.0MB

问题描述

  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如”-a“ 或”-b“。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
  该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, “ab:m:“ 表示该程序接受三种选项,即”-a“(不带参数),”-b“(带参数), 以及”-m“(带参数)。
  命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

输入格式

  输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
  输入的第二行是一个正整数 N(1 $\le$ N $\le$ 20),表示你需要处理的命令行的个数。
  接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

输出格式

  输出有 N 行。其中第 i 行以”Case i:“ 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。

样例输入

1
2
3
4
5
6
albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

样例输出

1
2
3
4
Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

解答

分析

  注意,参数可以和选项相同。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

struct OPT {

string name;
bool is_arg;
string argv;

OPT(string name, bool is_arg = false) {
this->name = name;
this->is_arg = is_arg;
this->argv = "";
}

};

bool cmp(OPT o1, OPT o2) {
return o1.name < o2.name;
}

int main() {

int n;
vector<OPT> form;
string str;

//初始化格式字符串
cin >> str;
for (int i = 0; i < str.size(); i++) {
if (str[i] != ':') {
form.push_back(OPT("-" + str.substr(i, 1)));
}
else {
form.back().is_arg = true;
}
}

cin >> n;

for (int i = 1; i <= n; i++) {

int j = 1;//选项字符串以空格开头
bool is_opt = true;//用于标记该字串是参数还是选项
vector<OPT> res;

cin >> str;//读取命令名称,不做操作直接跳过
getline(cin, str);//读取选项字符串

//裁剪&判断选项
while (j < str.size()) {
int l = 0;//裁剪的长度

while (j + l < str.size() && str[j + l] != ' ')//裁剪
l++;
string tstr = str.substr(j, l);


if (!is_opt) {//目标字符串应当为参数

res.back().argv = tstr;//将该参数赋予上一个选项

is_opt = true;
}
else {//目标字符串应当为选项
bool in = false;
for (auto k : form) {
if (k.name == tstr) {//找到对应的选项插入res
if (k.is_arg && j + l == str.size())//如果后面没有参数则直接终止
break;

res.push_back(k);
in = true;
is_opt = !k.is_arg;
break;
}
}

//如果该选项不存在或不合法则终止
if (!in)
break;
}

j += l + 1;
}

//按字典序排序
sort(res.begin(), res.end(), cmp);

//输出
cout << "Case " << i << ":";
for (j = 0; j < res.size(); j++) {
if (j == res.size() - 1 || res[j].name != res[j + 1].name) {
cout <<" "<<res[j].name;
if (res[j].is_arg)
cout <<" "<< res[j].argv;
}
}
cout << endl;
}

return 0;
}
-------- 本文结束 感谢阅读 --------
相关文章
  • CCF-CSP:201409-3字符串匹配
  • CCF-CSP/201312-3最大的矩形
  • CCF-CSP:201403-2窗口
  • CCF-CSP:201403-1相反数
  • CCF-CSP/201409-2画图
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: CCF-CSP:201403-3命令行选项
  • 本文作者: SiriYang
  • 创建时间: 2020年01月27日 - 17时01分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20200127174946id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
算法题 CCF-CSP
CCF-CSP:201409-3字符串匹配
CCF-CSP/201312-3最大的矩形
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 题目
    1. 问题描述
    2. 输入格式
    3. 输出格式
    4. 样例输入
    5. 样例输出
  2. 解答
    1. 分析
    2. 代码
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%