選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號後面跟單個小寫字母,如"-a" 或"-b"。而帶參數選項則由兩個由空格分隔的字符串構成,前者的格式要求與無參數選項相同,後者則是該選項的參數,是由小寫字母,數字和減號組成的非空字符串。
該命令行工具的作者提供給你一個格式字符串以指定他的命令行工具需要接受哪些選項。這個字符串由若干小寫字母和冒號組成,其中的每個小寫字母表示一個該程序接受的選項。如果該小寫字母后面緊跟了一個冒號,它就表示一個帶參數的選項,否則則爲不帶參數的選項。例如, "ab:m:" 表示該程序接受三種選項,即"-a"(不帶參數),"-b"(帶參數), 以及"-m"(帶參數)。
命令行工具的作者準備了若干條命令行用以測試你的程序。對於每個命令行,你的工具應當一直向後分析。當你的工具遇到某個字符串既不是合法的選項,又不是某個合法選項的參數時,分析就停止。命令行剩餘的未分析部分不構成該命令的選項,因此你的程序應當忽略它們。
輸入的第二行是一個正整數 N(1 ≤ N ≤ 20),表示你需要處理的命令行的個數。
接下來有 N 行,每行是一個待處理的命令行,它包括不超過 256 個字符。該命令行一定是若干個由單個空格分隔的字符串構成,每個字符串裏只包含小寫字母,數字和減號。
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b
#define MAX 256+10
#include<iostream>
#include<string>
#include<string.h>
#include<map>
using namespace std;
map<char, bool> para; // 標記命令是否帶參
int sym[26]; // 標記命令是否合法
int main(){
string pre; // 條件串
cin >> pre;
for (int i = 0; i < pre.length(); i++){
sym[pre[i]-'a']++;
if (i + 1 < pre.length() && pre[i + 1] == ':'){
para[pre[i++]] = true;
}
else{
para[pre[i]] = false;
}
}
int n;
cin >> n;
for (int i = 1; i <= n; i++){
string s;
char c = 0;
int tmp = 0;
bool pa = false;
int buk[26] = { 0 }; // 記錄參數是否出現
string buks[26]; // 記錄最後出現的參數
bool fr = true; // 用戶名可以沒有‘-’
while (c != '\n'){
cin >> s;
if (pa){ // 當前讀入是個參數
buks[tmp] = s; // 更新參數
pa = false;
}
else if (s[0] == '-' && sym[s[1]-'a']){ // 讀入一個合法命令
buk[s[1] - 'a']++;
if (para[s[1]]){ // 有參數
tmp = s[1] - 'a';
pa = true;
}
}
else{ // 當前讀入不是以‘-’開頭
if (fr){
fr = false;
c = getchar();
continue;
}
while (getchar() != '\n');
break;
}
c = getchar();
}
cout << "Case " << i << ":"; // 開始輸出
for (int j = 0; j < 26; j++){
if (buk[j]){
char c = 'a' + j;
cout << " -" << c;
if (para[j + 'a']){
cout <<" " << buks[j];
}
}
}
cout << endl;
}
return 0;
}