問題描述
試題編號: | 201403-3 |
試題名稱: | 命令行選項 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: | 問題描述 請你寫一個命令行分析程序,用以分析給定的命令行里包含哪些選項。每個命令行由若干個字符串組成,它們之間恰好由一個空格分隔。這些字符串中的第一個為該命令行工具的名字,由小寫字母組成,你的程序不用對它進行處理。在工具名字之后可能會包含若干選項,然后可能會包含一 些不是選項的參數。 選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號后面跟單個小寫字母,如"-a" 或"-b"。而帶參數選項則由兩個由空格分隔的字符串構成,前者的格式要求與無參數選項相同,后者則是該選項的參數,是由小寫字母,數字和減號組成的非空字符串。 該命令行工具的作者提供給你一個格式字符串以指定他的命令行工具需要接受哪些選項。這個字符串由若干小寫字母和冒號組成,其中的每個小寫字母表示一個該程序接受的選項。如果該小寫字母后面緊跟了一個冒號,它就表示一個帶參數的選項,否則則為不帶參數的選項。例如, "ab:m:" 表示該程序接受三種選項,即"-a"(不帶參數),"-b"(帶參數), 以及"-m"(帶參數)。 命令行工具的作者準備了若干條命令行用以測試你的程序。對于每個命令行,你的工具應當一直向后分析。當你的工具遇到某個字符串既不是合法的選項,又不是某個合法選項的參數時,分析就停止。命令行剩余的未分析部分不構成該命令的選項,因此你的程序應當忽略它們。 輸入格式 輸入的第一行是一個格式字符串,它至少包含一個字符,且長度不超過 52。格式字符串只包含小寫字母和冒號,保證每個小寫字母至多出現一次,不會有兩個相鄰的冒號,也不會以冒號開頭。 輸入的第二行是一個正整數 N(1 ≤ N ≤ 20),表示你需要處理的命令行的個數。 接下來有 N 行,每行是一個待處理的命令行,它包括不超過 256 個字符。該命令行一定是若干個由單個空格分隔的字符串構成,每個字符串里只包含小寫字母,數字和減號。 輸出格式 輸出有 N 行。其中第 i 行以"Case i:" 開始,然后應當有恰好一個空格,然后應當按照字母升序輸出該命令行中用到的所有選項的名稱,對于帶參數的選項,在輸出它的名稱之后還要輸出它的參數。如果一個選項在命令行中出現了多次,只輸出一次。如果一個帶參數的選項在命令行中出 現了多次,只輸出最后一次出現時所帶的參數。 樣例輸入 albw:x 4 ls -a -l -a documents -b ls ls -w 10 -x -w 15 ls -a -b -c -d -e -l 樣例輸出 Case 1: -a -l Case 2: Case 3: -w 15 -x Case 4: -a -b |
代碼
#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++;}}elsebreak;}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; }
?