分析: 这道题不是很难 用了一个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 }
抓住青春的尾巴。。。