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

本文主要是介绍CSP认证201403-3 命令行选项[C++题解]:模拟题、字符串处理、stringstream处理getline,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 题目解答
      • 题目链接

题目解答

在这里插入图片描述
在这里插入图片描述

来源:acwing

分析:

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

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

ls -a -l -a documents -b

在这里插入图片描述

这里使用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 ~ zfor(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/

这篇关于CSP认证201403-3 命令行选项[C++题解]:模拟题、字符串处理、stringstream处理getline的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465786

相关文章

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为