问题描述
试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
代码
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
using namespace std;
void spilt(vector<string>& v, char s[], char t[])
{
char *sp;
sp=strtok(s,t);
while(sp)
{
v.push_back(sp);
sp=strtok(NULL,t);
}
}
void mygetline(char pc[])
{
char c;
while((c=getchar())!='\n'&&c!=EOF)
*pc++=c;
*pc='\0';
}
int main()
{
string format;
char s[257];
int i,j,n;
cin>>format>>n;
getchar();
for(i=1;i<=n;i++)
{
vector<string> sv;
map<string,string> m;
mygetline(s);
// 切分命令行:命令和各个参数分开
spilt(sv,s," ");
// 处理各个参数,放入map变量m中
for(j=1;j<(int)sv.size();j++)
{
// 判断是否是选项,选项则处理
if(sv[j].size()==2&&sv[j][0]=='-')
{
int pos=format.find(sv[j][1]);
// 选项在格式中未找到则出错结束
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;
}
return 0;
}