命令行选项
问题
问题描述
试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
解题思路:
模拟题,对输入数据进行处理,运用stl进行解题,输入命令sv以后,使用spilt对sv进行分割,对每个命令进行单独处理,如果满足条件放入map中,如果有参数,则更新map。
代码:
#include <iostream>
#include <algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#define rep(i,s,e) for(int i = s;i<e;i++)
using namespace std;
int maxSize = 300;
typedef long long ll;
char *delimiters = " ";
int myGets(char *p){
char c;
while((c=getchar())!='\n'&&c!=EOF){
*p++ = c;
}
*p='\0';
return 1;
}
int spilt(vector<string>& sv,char *s,char *t){
char *sp = strtok(s,t);
while(sp){
//cout<<sp<<endl;
sv.push_back(sp);
sp = sp = strtok(NULL, t);
}
return 1;
}
int main(){
string format;
char s[maxSize];
int n;
cin>>format>>n;
getchar();
rep(i,1,n+1){
vector<string> sv;
map<string,string> m;
//读入匹配串
myGets(s);
//对匹配串进行处理
spilt(sv,s,delimiters);
//cout<<sv.size()<<endl;
for(int j = 1; j<(int)sv.size();j++){
if(sv[j].size()==2&&sv[j][0]=='-'){
int pos = format.find(sv[j][1]);
//cout<<pos<<endl;
if(pos==-1) break;
if(m.find(sv[j])==m.end()){
m[sv[j]] = "";
}
if(format[pos+1]==':'&&j+1<(int)sv.size()){
m[sv[j]] = sv[j+1];
j++;
}
}else{
break;
}
}
cout<<"Case "<<i<<":";
for(map<string,string>::iterator iter = m.begin();iter!=m.end();iter++){
cout<<" "<<iter->first;
if(iter->second!=""){
cout<<" "<<iter->second;
}
}
cout<<endl;
}
}