试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
问题链接:CCF201403-3 命令行选项
问题分析:掌握STL对于解决文本处理的问题有很大的帮助。程序=数据结构+算法,写程序前先要根据题意选择合适的数据结构,此问题有3个需要存储的东西,选项,命令和结果,命令可用vector<string>存储;由于需要判断一个命令是否是合法的选项,因此选项可用map<string,bool>存储,第一个值表示选项的名称,第二个值表示选项是否带参数;结果可能是两个值的组合,一个选项,一个参数,因此使用map<string,string>表示,这就使得结果默认就是按照键值递增排列,符合题意,具体看程序。
程序说明:注意strtok函数的使用
提交后得100分的C++程序:
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
using namespace std;
map<string,bool>op;//选项,第一个表示选项名,第二个表示是否带参数,带参数为true
map<string,string>res;//答案,第一个表示选线名,第二个表示参数,如果每参数就置为空
vector<string>dem;//命令
void init()
{
string s,s1;
cin>>s;//输入选项
for(int i=0;i<s.length();i++)
if(s[i]!=':'){
s1="-";
s1.insert(1,1,s[i]);
if(i<s.length()-1&&s[i+1]==':')
op[s1]=true; //带参数的选项
else
op[s1]=false; //不带参数的选项
}
}
void solve()
{
res.clear();//初始化存储结果的映射
for(int i=1;i<dem.size();i++){ //从1开始,忽略工具名
if(op.count(dem[i])==0)//如果它不是选项就停止分析
return;
bool para=op[dem[i]];
if(para){//如果是带参数的选项
if(i==dem.size()-1)//但i是最后一个元素了,说明它的参数是空了,就停止分析
return;
res[dem[i]]=dem[i+1];
i++;//跳过参数
}
else{ //如果是不带参数的选项
res[dem[i]]="";
}
}
}
int main()
{
int n;
init();
cin>>n;
getchar();
for(int i=1;i<=n;i++){//读入命令
dem.clear();
char a[260];//临时数组
gets(a);
char *sp=strtok(a," ");//以空格分割
while(sp){
dem.push_back(sp);
sp=strtok(NULL," ");
}
solve();
cout<<"Case "<<i<<": "; //map默认以键值递增排序
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;
}