分析: 这道题不是很难 用了一个split()函数

核心是: 对命令选项的判断 不要一个字符字符的判断 要一项一项的判断

             比如ab:m:  

分析步骤 (1) 读取一个字符(2)判断下一步是否有字符,下一个字符是否是':', 若是':",前进两位,标为带参数 否则前进一位,不带参数

对于命令的分析也是

不带参数 读取一项

带参数   读取两项

即--------整体分析,这样的循环结构是清晰简洁的

缺点 :用了好多if-else结构 不好看

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=30;
 4 int  is_c[N]; // 是否带参数
 5 bool flag[N]; // 是否出现 
 6 string  w[N];  // 记录参数
 7 int n;
 8 vector <string> split (string str,const char flag=' ') {
 9     istringstream iss(str);
10     vector <string> ans;
11     while (getline(iss,str,flag)) 
12         if (str.size())
13             ans.push_back(str);
14     return ans;
15 }
16 void get_ord (string str) {
17     int i=0;
18     while (i<str.size()) {
19         if (i<str.size()&&str[i+1]==':') {
20             is_c[str[i]-'a']=2;
21             i+=2;
22         }
23         else { is_c[str[i]-'a']=1; i+=1; }
24     }
25 }
26 int main ()
27 {
28     string ord; cin>>ord; get_ord(ord); 
29     cin>>n; getchar();
30     int T=0;
31     while (++T<=n) {
32         string str;  getline(cin,str);
33         vector <string> sv=split(str);
34         memset (flag,0,sizeof(flag));
35         cout<<"Case "<<T<<":";
36         for (int i=1;i<sv.size();i++) {
37             if (sv[i].size()==2&&sv[i][0]=='-') {
38                 int id=sv[i][1]-'a';  
39                 if (is_c[id]) {
40                     flag[id]=1;
41                     if (is_c[id]==2) {
42                         if (i+1<sv.size())   w[id]=sv[++i];  // 这个不判断的话只有90
43                         else                 break;
44                     }
45                 }
46                 else break;
47             }
48             else    break;
49         }
50         for (int i=0;i<N;i++)
51             if (flag[i]) {
52                 char ch='a'+i; cout<<" -"<<ch;
53                 if (is_c[i]==2) cout<<" "<<w[i]; 
54             } 
55         cout<<"\n";
56     }
57     return 0;
58 }