思路:每行的命令用getline( )读入,读入后把其输入到streamstring中,每次以空格分隔成字符串,判断每一个字符串是否合法。最后把合法的选项存入到map中,map正好符合题意:当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
几大坑点:
- cin>>输入后缓冲区会剩下换行符,用cin.ingore()来清空缓冲区,否则,getline( )读不到第一行命令。
- 最后的输出的时候:之后有一个空格,否则,会的0分。
代码如下:
#include<iostream>
#include<string>
#include<sstream>
#include<map>
using namespace std;
int main(){
string str0;
cin>>str0;
int n;
cin>>n;
// 清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入
cin.ignore();
for(int i = 1; i <= n; i++){
map<string,string> m;
string str1,arg;
getline(cin,str1);
stringstream ss;
ss<<str1;
ss>>str1;//先跳过第一个
while(ss>>str1){
if(str1[0] == '-'){
int index = str0.find(str1[1]);
if(index == -1)//非法选项
break;
else{
if(index == str0.size()-1)//不带参数
m[str1] = "";
else if(str0[index+1] != ':')//不带参数
m[str1] = "";
else if(str0[index+1] == ':'){//带参数
if(ss>>arg)
m[str1] = arg;
else
break;
}
}
}
else//非法选项
break;
}
cout<<"Case "<<i<<": ";//冒号之后有空格,没有0分。
map<string,string> :: iterator it;
for(it = m.begin(); it != m.end(); it++){
cout<<it->first<<' '<<it->second<<' ';
}
cout<<endl;
ss.clear();
ss.str("");
}
return 0;
}