CCF CSP2014 03-3命令行选项
l:fv:xbb
100
lsa -l-d
Case 1:
ls -l-d vvv
Case 2: -l vvv
连续命令只处理第一个,命令从第一个空格开始处理
思路:简单模拟,使用map存储自动排序,有注释。
代码如下:
#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
map<string, int>mp;
map<string, string>ans;
int main(){
//存储可选命令,值为1代表不带参数,2代表带参数
string s;
getline(cin,s);
for(int i = 0; i < s.size(); i++){
if(s[i] >= 'a' && s[i] <= 'z'){
string str = "";
str += s[i];
mp[str] = 1;
if(i+1 < s.size() && s[i+1] == ':'){
i++;
mp[(str)] = 2;
}
}
}
int n;
cin>>n;
cin.get();
for(int i = 1; i <= n; i++){
getline(cin,s);
cout<<"Case "<<i<<":";
//从第一个空格后一个字符开始处理
for(int j = s.find(' ')+1; j < s.size(); j++){
if(s[j] == '-'){
string str = "";
//检测到命令只选取一个字符
if(j+1 < s.size() && s[j+1] >= 'a' && s[j+1] <= 'z'){
j++;
str += s[j];
}
//跳到下一个空格处
if(s.find(' ',j)!=-1) j = s.find(' ',j);
//命令长度不为1
if(str.size() != 1) break;
else{
//不在命令参数表中
if(!mp[str]){
break;
}
else{
//分有无带参数
if(mp[str] == 1){
ans[str] = "";
}
else{
if(j > s.size()) break;
string sub = " ";
while(j+1 < s.size() && s[j+1]!=' '){
j++;
sub += s[j];
}
if(sub!=" ")ans[str] = sub;
}
}
}
}
else if(s[j]!=' '){
break;
}
}
for(map<string, string>::iterator it = ans.begin(); it!=ans.end(); it++){
cout<<" -"<<it->first<<it->second;
}
cout<<endl;
//初始化
ans.clear();
}
return 0;
}