201403-3-命令行选项

一、题目描述

在这里插入图片描述

二、思考

这题我感到困难的有以下几点:

  1. 如何判断输入命令是参数还是无参数:
    答:由于命令是小写字母,我们可以使用两个bool数组进行判别。
  2. 如何处理输入的命令行:
    答:使用string类型输入,使用stringstream进行字符串分割。
  3. 如何输出结果:
    答:同理第一问,由于命令都是小写字母,那么我们使用一个string ans[]存储参数,下标对应着参数。
  4. 这题默认输入的有参数选项后面一定是有字符串作为参数的,比如我们输入:
    albw:x
    1
    ls -w 10 -x -w -a -b
    
    注意看第二个-w后面跟的是-a,那么我们就把-a看成是-w的参数而不是作为命令(这是根据题目中参数的定义由减号、字母和数字构成)。那么最后的输出就应该是:
    Case 1: -b -w -a -x
    

三、代码

#include <iostream>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <vector>
using namespace std;

int n;
bool o1[26], o2[26];

int main() {
    string str;
    cin >> str >> n;
    for ( int i = 0; i < str.size(); i++ ) {//输入字符串并进行处理
        if ( str[i] != ':' ) {
            if ( i != str.size() - 1 && str[i + 1] == ':' ) o2[str[i] - 'a'] = true;
            else o1[str[i] - 'a'] = true;
        }
    }
    getchar();
    for ( int i = 1; i <= n; i++ ) {
        getline(cin, str);
        stringstream ssin(str);
        string ans[26];
        vector<string> ops;
        while( ssin >> str ) ops.push_back(str);//对输入命令进行分割
        for ( int j = 1; j < ops.size(); j++ ) {//从下标1开始便利,0是ls
            if ( ops[j][0] != '-' || ops[j][1] < 'a' || ops[j].size() != 2 ) break;
            int k = ops[j][1] - 'a';
            if (o1[k]) ans[k] = "*";
            else if (o2[k] && j + 1 < ops.size()) ans[k] = ops[j + 1], j++;
            else break; 
        }
        printf("Case %d:", i);
        for ( int j = 0; j < 26; j++ ) {
            if (ans[j].size()) {
                cout << " -" << char( j + 'a' );
                if ( o2[j] ) cout  << " " << ans[j];  
            }
        }
        cout << endl;
    }
    return 0;
}

四、知识点

使用stringstrem分割字符串:

  1. 默认使用空格、tab和换行分割
    stringstream ssin(str);
    vector<string> ops;
    while( ssin >> str ) ops.push_back(str);
    
  2. 使用其他字符进行分割:
    stringstream ssin(str);
    vector<string> ops;
    while( getline(ssin, str, ',') ops.push_back(str);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值