思路:沉下心来认真读题就行了,注意边界情况,map<key,value>是根据key值自动从小到大排序的,对于这个题很合适,使用map最后直接遍历就行了。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
const int N = 1005;
string getnow(string s,int &num)//以空格为分界符截取一个字符串
{
if(num>=s.size())
return NULL;
string ans;
while(s[num]!=' '&&num<s.size())
ans+=s[num++];
num++;
return ans;
}
int main()
{
map<char,int> mp;
map<string,string> ans;
map<string,string>::iterator it; //迭代器,用来遍历map
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(i+1<s.size()&&s[i+1]==':') //mp值为2代表有参数,为1代表没参数
mp[s[i]]=2,i++;
else
mp[s[i]]=1;
}
int t;
cin>>t;
getchar(); //没有getchar会出错,因为前一个字符串后面还有一个换行符,如果不吃掉换行符,getline函数会读取这个换行符
for(int cas=1;cas<=t;cas++)
{
ans.clear(); //初始化
string tem;
getline(cin,tem);
int i=0;
string xxx=getnow(tem,i);
while(i<tem.size())
{
string s1=getnow(tem,i);
// cout<<"s="<<s1<<" "<<mp[s1[1]]<<endl;
if(s1.size()<1||s1[0]!='-'||!mp[s1[1]]||s1.size()>2) //如果不是选项,跳出
break;
else if(mp[s1[1]]==2)
{
if(i>=tem.size()) break; //如果是带参数的但是后面没有字符串了,跳出
string s2=getnow(tem,i);
ans[s1]=s2;
}
else
ans[s1]="#";
}
printf("Case %d:",cas);
for(it=ans.begin();it!=ans.end();it++)
{
cout<<" "<<it->first;
string ss=it->second;
if(ss!="#")
cout<<" "<<ss;
}
cout<<endl;
}
return 0;
}