ccf 2014-03-3 命令行选项(字符串模拟+map)

思路:沉下心来认真读题就行了,注意边界情况,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;
}

上一篇:Android基础之四大组件


下一篇:计量画图示例大作,中国经济区域发展,倾情推荐