试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
思路:stringstream与string的转化
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps = 1e-6;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int N = 2e1+5;
string ans[26];
int type[26];///type[i]=0表示不存在选项
int main() {
string str,sstr;
cin>>sstr;
for(int i=0; i<sstr.size(); i++) {
int arg;
if(sstr[i]==':') {
type[arg]=2;///带参数
} else {
arg=sstr[i]-'a';///转化为下标
type[arg]=1;///不带参数
}
}
int n;
cin>>n;
cin.ignore();
for(int cas=1; cas<=n; cas++) {
getline(cin,str);
stringstream ss(str);
ss>>str;///ls
while(ss>>str) {
if(str[0]=='-') {
int arg=str[1]-'a';
if(type[arg]==0) {
break;///非合法选项
} else if(type[arg]==1) { ///不带参数
ans[arg]=" ";
} else if(type[arg]==2) {
if(ss.eof()) break;///有参数项但是没输入参数
ss>>str;
ans[arg]=str;
}
} else {
break;
}
}
cout<<"Case "<<cas<<":";
for(int i=0; i<26; i++) {///从小到大输出
// printf("i=%d %d\n",i,type[i]);
if(type[i]==1&&ans[i]!="") {
cout<<" -"<<char(i+'a');
}
if(type[i]==2&&ans[i]!="") {
cout<<" -"<<char(i+'a')<<" "<<ans[i];
}
ans[i]="";
}
cout<<endl;
}
return 0;
}