CCF- CSP 201403-3 命令行选项 字符流 满分题解
题目链接:201403-3 命令行选项
题目导读:
- 名字不重要,pass
- 带参数的选项和不带参数的选项在第一行格式字符串中已经给出,当处理后续的字母时,需要判断该字母是否在格式字符串中
- 如果是带参数的选项,后一个字符串即为参数
- 最后输出的时候,需要按照升序进行输出
思路:
- 首先预处理格式字符串,对字符串中的每个字母单独处理,如果是带参数的字母,标记为
1
,不带参数的字母表计为2
- 字符流处理字符串时,需要注意,在输入
n
时,后面会有一个'\n'
,因此需要用getchar
处理换行符 - 采用字符流中
strinfstream
和getline
配合,将整个行,划分为不同的字符串,去除空格,用vector
进行保存 map
会自动按照key
升序进行排序,map
的key
值存储当前的字母,value
值存储字符串- 分别判断当前字母是否带参数,进行讨论
代码如下:
#include<iostream>
#include<cstring>
#include<sstream>
#include<map>
#include<unordered_map>
#include<vector>
#include<algorithm>
using namespace std;
string s;
int n;
unordered_map<char, int> diff;//1带参数,2不带参数
int main()
{
cin>>s;
cin>>n;
getchar();//除去n后面的换行'\n'
for(int i=0;i<s.length();i++)
{
if(s[i+1]==':')
{
diff[s[i]]=1;
}
else
{
diff[s[i]]=2;
}
}
for(int i=1;i<=n;i++)
{
vector<string>str;
map<char,string> m;//map会对key值按照升序进行排序
getline(cin, s);//接收一个字符串,可以接收空格并输出
stringstream ssin(s);//字符流处理s,将单个字符串存入str
while(ssin>>s) str.push_back(s);
for(int j=1;j<str.size();j++)//str[0]为名字,pass
{
if(str[j][0]!='-'||str[j][1]<'a'||str[j].size()!=2)break;//对含有'-'的字符串进行判断(无参、有参字符的开头)
char c = str[j][1];//取出首个字母
if(diff[c]==1&&j+1<str.size())
{
m[c]=str[j+1];// value存储后面一个字符串
j++;
}
else if(diff[c]==2)//value存储当前值
{
m[c]=c;
}
else break;
}
cout<<"Case "<<i<<": ";
for(auto k:m)
{
//为有参数
if(diff[k.first]==1)
{
cout<<"-"<<k.first<<" "<<k.second<<" ";
}
//为无参数
else if(diff[k.first]==2)
{
cout<<"-"<<k.second<<" ";
}
}
cout<<endl;
}
}