【CCFCSP】201403-3 命令行选项

试题编号: 201403-3
试题名称: 命令行选项
时间限制: 1.0s
内存限制: 256.0MB

本题使用STL中的map可以使得实现变得很简单。
首先用字符串读取第一行,如果某一字符之后是“:”,则type记为1,即带参数选项,否则type为2,即不带参数选项,字符串的最后一个字符要做特殊判断(有可能为“:”或选项)。
然后读取每一行的输入,对字符串的内容逐个处理,因为输入中可能包含带参数选项及其参数,所以可以把读取过程分为多个状态。设置一个bool型的flag。flag = 0表示上一个读入的内容不是带参数选项,就判断这个读入内容是否为合法的命令选项,如果不是就直接退出循环,如果是带参数选项,就把flag值设为1,如果是不带参数选项,保存这个参数。flag = 1时,把读入的内容作为上一个带参数选项的参数进行保存。
注意读入内容时的细节,可以用string中的find命令定位每个内容的位置,然后再把内容保存出来,同时要另外保存带参数选项,以便读到其参数时把它们一起保存到map中。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
map<char, int>type;//记录第一行读取到的命令选项的类型
map<char, string>para;//保存选项及其参数(不带参数选项的参数记为"*")
string s, s1, s2;
int main() {
    cin >> s;
    int T;
    for (int i = 0; i < s.length() - 1; i++) {
        if (s[i] != ':' && s[i + 1] == ':') {
            type[s[i]] = 1;
        }
        else if (s[i] != ':')
            type[s[i]] = 2;
    }
    if (s[s.length() - 1] != ':') type[s[s.length() - 1]] = 2;//判断最后一个字符
    cin >> T;
    cin.get();//以免读入换行符
    bool flag;
    for (int cs = 1; cs <= T; cs++) {
        getline(cin, s);//字符串读入一行的输入
        flag = 0;
        para.clear();//要注意map的初始化
        int p1, p2;
        while ((p1 = s.find(' ')) != -1) {
            s[p1] = 0;
            p2 = s.find(' ');
            if (p2 == -1) p2 = s.length();//读到字符串末尾
            s2 = s.substr(p1 + 1, p2 - p1 - 1);//保存内容
            if (!flag) {
                if (s2[0] != '-' || !type[s2[1]]) 
                    break;//如果是非法内容,直接退出循环
                if (type[s2[1]] == 2) {
                    para[s2[1]] = "*";//保存不带参数选项
                }
                else {
                    s1 = s2;//如果是带参数选项,对其另做保存
                    flag = 1;
                }
            }
            else {
                para[s1[1]] = s2;//读入参数后保存选项和参数
                flag = 0;
            }
        }
        cout << "Case " << cs << ":";
        for (map<char, string>::iterator it = para.begin(); it != para.end(); it++) {
            //输出map中保存的内容
            cout << " -" << (*it).first;
            if ((*it).second[0] != '*')
                cout << ' ' << (*it).second;
        }
        cout << endl;
    }
}

你可能感兴趣的:(CCFCSP)