題目:
選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號後面跟單個小寫字母,如"-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
思路:
模擬。
我卡在這種測試數據:
albw:x
1
ls -w 10 -x -w
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define MAX 207
using namespace std;
typedef long long ll;
map<string,string> mp;
int main(){
string format;
cin>>format;
int n;
cin>>n;
getchar();
for(int t=0;t<n;++t){
string s;
getline(cin,s);
int p=0,len=s.length();
mp.clear();
while(p<len && s[p]!=' ')p++;
p++;
while(p<len){
string op="",ag=""; //op代表操作,ag代表參數
//從輸入中截取操作串
while(p<len && s[p]!=' '){
op+=s[p];
p++;
}
p++;
//由於命令只有兩個字符,並且以'-'開頭 ,如果長度不爲2或者不以'-'開頭都不行,並且命令應在格式串中有說明
if(op.length()!=2 || op[0]!='-' || (op[0]=='-' && format.find(op[1])==string::npos))break;
//如果帶參數,則要從輸入中獲取參數
if(format.find(op.substr(1,1)+":")!=string::npos){
//如果有參數,但無法獲取則結束;(題目中好像卡了這個數據)
if(p>=len)break;
//截取參數
while(p<len && s[p]!=' '){
ag+=s[p];
p++;
}
p++;
}
mp[op]=ag;
}
printf("Case %d:",t+1);
//輸出需認證考慮,不要帶有多餘的空格
for(map<string,string>::iterator i=mp.begin();i!=mp.end();i++){
cout<<" "<<i->first;
if(i->second != "")cout<<" "<<i->second;
}
cout<<endl;
}
return 0;
}