CCF- CSP 201403-3 命令行选项 字符流 满分题解

CCF- CSP 201403-3 命令行选项 字符流 满分题解

题目链接:201403-3 命令行选项

题目导读:

  • 名字不重要,pass
  • 带参数的选项和不带参数的选项在第一行格式字符串中已经给出,当处理后续的字母时,需要判断该字母是否在格式字符串中
  • 如果是带参数的选项,后一个字符串即为参数
  • 最后输出的时候,需要按照升序进行输出

思路:

  • 首先预处理格式字符串,对字符串中的每个字母单独处理,如果是带参数的字母,标记为1,不带参数的字母表计为2
  • 字符流处理字符串时,需要注意,在输入n时,后面会有一个'\n',因此需要用getchar处理换行符
  • 采用字符流中strinfstreamgetline配合,将整个行,划分为不同的字符串,去除空格,用vector进行保存
  • map会自动按照key升序进行排序,mapkey值存储当前的字母,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;
    }   
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值