试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
问题分析:选项是两个字符,而且第一个字符要是’-‘。结果用map保存,会自动按字典序排序; 命令重复时, 特别是对有参数的选项, 替换起来非常方便。
#include <iostream>
#include <map>
#include <sstream>
#include <algorithm>
using namespace std;
map<char,int> op;
// 用map保存结果会自动升序排序
map<string,string> res;
int whatis(string str) {
if(str.size()==2&&str[0]=='-') {
return op[str[1]];
}
return 0;
}
void run(string line) {
string str,tmp;
res.clear(); // 清空map
// 按空格一个个获取
istringstream is(line);
is>>str;
while(is>>str) {
switch(whatis(str)) {
case 1:
res[str]="";
break;
case 2: // 如果带参数,直接再读一个
if(is>>tmp) {
res[str]=tmp;
} else { // 读取失败说明格式不对
return;
}
break;
default:
return;
}
}
}
int main(void) {
int N;
string tmp,str,ttmp;
cin>>tmp;
for(int i=0; i<tmp.size(); i++) {
if(tmp[i+1]==':') {
op[tmp[i]]=2;
i++;
} else {
op[tmp[i]]=1;
}
}
cin>>N;
getchar();
for(int i=0; i<N; i++) {
getline(cin,tmp); // 读取一行
run(tmp);
// 输出结果
cout<<"Case "<<i+1<<":";
for(map<string,string>::iterator it=res.begin(); it!=res.end(); it++) {
cout<<' '<<it->first;
if(it->second!=""){
cout<<' '<<it->second;
}
}
cout<<endl;
}
return 0;
}