140303 命令行選項 ccf

參考c++

https://blog.csdn.net/wjh2622075127/article/details/81639534ide

思路工具

map容器 存儲 有效命令表 和 輸入的有效命令的參數測試

set容器   存儲 輸入的有效命令 (可自動排序)spa

在有效命令表的存儲中加上‘-’,避免有效命令檢索的麻煩.net

實現命令行

 1 #include<bits/stdc++.h>
 2 
 3 
 4 using namespace std;
 5 
 6 map<string,int> table;//有效命令表 
 7 vector<string> order;//輸入命令 
 8 map<string,string> can;//參數 
 9 set<string> ans; //輸入命令中的有效命令 
10 
11 int main(){
12     string s;
13     cin>>s;
14     //有效命令表 
15     for(size_t i=0;i<s.size();i++){
16         string no;
17         stringstream t;
18         t<<'-'<<s[i];
19         t>>no;
20         if(i<s.size()-1&&s[i+1]==':'){//有參數 
21             table[no]=1;
22             i++;
23         }
24         else{//無參數 
25             table[no]=0;
26         }
27     }
28      
29     int n;
30     cin>>n;
31     cin.get();
32     
33     for(int i=1;i<=n;i++){
34         
35         order.clear();
36         can.clear();
37         ans.clear();
38         
39         getline(cin,s);
40         stringstream ss;
41         ss<<s;
42         while(ss>>s){
43             order.push_back(s);
44         }
45         //分析輸入命令
46         for(size_t j=1;j<order.size();j++){
47             //命令是否合法 
48             if(table.count(order[j])==0){
49                 break;
50             }
51             //不帶參 
52             if(table[order[j]]==0){
53                 ans.insert(order[j]);
54             } 
55             //帶參 
56             else if(j<order.size()-1){
57                 ans.insert(order[j]);
58                 can[order[j]]=order[j+1];
59                 j++;
60             }
61             else{
62                 break;
63             } 
64         }
65         //輸出
66         cout<<"Case "<<i<<":";
67         set<string>::iterator is=ans.begin();
68         while(is!=ans.end()){
69             if(can.count(*is)>0){
70                 cout<<' '<<*is<<' '<<can[*is];
71             }
72             else{
73                 cout<<' '<<*is;
74             }
75             is++;
76         }
77         cout<<endl;
78     }
79     
80     return 0;
81 }
View Code

題目code

問題描述
 
  請你寫一個命令行分析程序,用以分析給定的命令行裏包含哪些選項。每一個命令行由若干個字符串組成,它們之間剛好由一個空格分隔。這些字符串中的第一個爲該命令行工具的名字,由小寫字母組成,你的程序不用對它進行處理。在工具名字以後可能會包含若干選項,而後可能會包含一 些不是選項的參數。
  選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號後面跟單個小寫字母,如"-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
相關文章
相關標籤/搜索