CSP认证201403-3 命令行选项2[C++题解]:模拟题、字符串处理、stringstream处理getline

文章目录

题目解答

CSP认证201403-3	命令行选项2[C++题解]:模拟题、字符串处理、stringstream处理getline
CSP认证201403-3	命令行选项2[C++题解]:模拟题、字符串处理、stringstream处理getline

来源:acwing

分析:

输出要求:对于无参数的选项,输出即可,当然每个只需要输出一次;对于有参数的选项,需要输出最后出现时所带的参数。

当遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。
比如下面例子, -a是无参数的选项,所以 第二次出现时后面带有参数就是不合法的,我们直接忽略,结果就是 -a -l,后面的-b被忽略。

ls -a -l -a documents -b

CSP认证201403-3	命令行选项2[C++题解]:模拟题、字符串处理、stringstream处理getline

这里使用getline()读入一行,然后这一行怎么拆分呢?使用的是stringstream 类,实例化对象ssin,它从字符串中读取字符,以空格切分。然后将拆分出来的每个单词放到vector中。 具体如下:ssin是变量名,可以随便取。

 stringstream  ssin(str);//从字符串开始读,以空格隔开
vector<string> ops;
 while(ssin>>str) ops.push_back(str);

同时:对于无参数的选项和有参数的选项我们开两个bool数组来存,o1[]存 无参数的,o2[] 存有参数的,出现过置为true,这样就可以知道每个选项带参数与否。

最终的结果存在ans[]数组中,这个数组的目的是确保哪个选项是要被输出的,如果是无参的,随便填个数占位;如果是有参的,这里存的是参数。

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int n;
bool o1[N], o2[N];// o1是无参数, o2是有参数
string ans[N]; //存答案

int main(){
    string str;
    cin >> str;
    for(int i = 0; i< str.size(); i++)
        if( i+ 1 < str.size() &&  str[i+1] == ':'){
            o2[str[i] - 'a'] = true; // 有参数的
            i++; // 跳过冒号
        }
        else o1[str[i] - 'a'] = true;  // 无参数的
        
    cin >> n;
    getchar();
    for(int C = 1;C <= n; C++){
        printf("Case %d:", C);
        getline(cin, str);
        stringstream ssin(str);
        vector<string> ops;
        while(ssin >> str) ops.push_back(str);
        for(int i = 0; i < 26; i++)  ans[i].clear();
        // 处理每个命令行选项
        for(int i =1; i< ops.size(); i++){
            if(ops[i][0] != '-' || ops[i][1] < 'a' || ops[i].size() != 2)
                break;
            int k = ops[i][1] - 'a'; //选项的编号
            if(o1[k]) ans[k] = "*";
            // 有参数的,ans[k]存的是参数值
            else if( o2[k] &&  i + 1 < ops.size() ) ans[k] = ops[i+1], i ++;
            else break;
        }
         // 按照字典序输出选项 a ~ z
        for(int i = 0; i< 26; i++){
            if( ans[i].size()){
                cout << " -" << (char)(i + 'a');
                if(o2[i]) cout << ' ' << ans[i];
            }
        }
        cout << endl;
        
    }
}

题目链接

https://www.acwing.com/problem/content/3202/

上一篇:MongoDB Ops Manager部署


下一篇:运维利器-ClusterShell