【CSP】201403-3-命令行选项

news2025/1/14 18:36:58

CSP-201403-3-命令行选项

关键点:将整行字符串按空格分割

在解析命令行时,一个常见的需求是将整个命令行字符串分割成多个部分,通常以空格为分隔符。这些部分包括命令行工具的名称、选项(可能带有前缀---)和这些选项的参数。C++中,std::stringstream类是处理这种任务的一个非常方便的工具,因为它允许我们像处理输入文件一样处理字符串,使用空白字符(如空格)作为默认的分隔符。下面的代码段展示了如何使用stringstream来分割命令行:

string cmdLine;
getline(cin, cmdLine); // 从标准输入读取整行命令行
stringstream ss(cmdLine); // 将命令行字符串封装进 stringstream
vector<string> tokens; // 用于存储分割后的字符串
string token; // 临时变量,用于存储每次从 stringstream 中提取的字符串

// 使用 while 循环和 >> 操作符从 stringstream 中提取字符串
// 操作符 >> 会自动根据空白字符(包括空格、制表符等)分割字符串
while (ss >> token) {
    tokens.push_back(token); // 将提取的字符串存入 vector
}

解题思路

  1. 初始化和读取输入

    • 程序首先读入一个格式字符串 formatStr,该字符串定义了命令行工具接受的选项及其类型(带参数或不带参数)。
    • 然后,读取一个正整数 n,表示需要处理的命令行个数。
    • 为每种选项设置两个布尔数组 hasNoArghasArg,分别用于标记无参数选项和带参数选项。
  2. 预处理选项类型

    • 使用一个循环遍历格式字符串 formatStr
    • 如果一个字母后面跟着一个冒号,则表示这是一个带参数的选项,将对应的 hasArg 设置为 true,并跳过冒号。
    • 如果字母后面没有冒号,则表示这是一个不带参数的选项,将对应的 hasNoArg 设置为 true
  3. 命令行处理

    • 使用 stringstream 将整个命令行分割为单独的字符串(tokens),这些字符串包括命令行工具的名字和后面的选项或参数。
    • 清空存储选项参数的数组 optionArgs,为新的命令行准备。
  4. 解析命令行选项

    • 遍历命令行中的每个字符串(从第二个开始,因为第一个是命令行工具的名字)。
    • 检查每个字符串是否符合无参数选项的格式(以"-"开头,后跟单个小写字母)。
    • 如果是无参数选项,并且这个选项在格式字符串中定义了,则在 optionArgs 中为该选项设置一个特殊值(如"#")来表示该选项存在但无参数。
    • 如果是带参数选项,并且这个选项在格式字符串中定义了,且后面紧跟着一个参数,则将这个参数保存到 optionArgs 中,并跳过这个参数,以免将其误认为另一个选项。
  5. 输出结果

    • 遍历 optionArgs 数组,按字母顺序输出所有在命令行中出现的选项。
    • 对于无参数选项,只打印选项名。
    • 对于带参数选项,打印选项名和最后出现时所带的参数。
    • 如果一个选项在命令行中未出现,或者格式不正确,则忽略它。

完整代码

#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;

// 定义常量,代表可能的最大选项数
const int MAX_OPTIONS = 26;

// 定记无参选项和有参选项
bool hasNoArg[MAX_OPTIONS];
bool hasArg[MAX_OPTIONS];

// 存储每个选项的参数(如果有)
string optionArgs[MAX_OPTIONS];

int main()
{
    string formatStr;
    cin >> formatStr;

    // 预处理选项类型
    for (int i = 0; i < formatStr.length(); i++) {
        if (i + 1 < formatStr.length() && formatStr[i + 1] == ':') {
            hasArg[formatStr[i] - 'a'] = true;
            i++; // 跳过冒号
        }
        else {
            hasNoArg[formatStr[i] - 'a'] = true;
        }
    }

    int n;
    cin >> n;
    cin.ignore(); // 吸收换行符

    for (int i = 1; i <= n; i++) {
        string cmdLine;
        getline(cin, cmdLine);
        cout << "Case " << i << ":";

        stringstream ss(cmdLine);
        vector<string> tokens;
        string token;

        // 分割命令行至vector中
        while (ss >> token) {
            tokens.push_back(token);
        }

        // 清空每个选项的参数,为新的命令行准备
        for (int j = 0; j < MAX_OPTIONS; j++) {
            optionArgs[j].clear();
        }

        // 解析命令行
        for (int j = 1; j < tokens.size(); j++) {
            if (tokens[j][0] != '-' || tokens[j].length() != 2 || tokens[j][1] < 'a') break;

            int index = tokens[j][1] - 'a';
            if (hasNoArg[index]) {
                optionArgs[index] = "#"; // 代表该选项存在,但没有参数
            }
            else if (hasArg[index] && j + 1 < tokens.size()) {
                optionArgs[index] = tokens[++j]; // 存储选项参数并跳过参数
            }
            else break;
        }

        // 输出选项和参数
        for (int j = 0; j < MAX_OPTIONS; j++) {
            if (!optionArgs[j].empty()) {
                cout << " -" << char(j + 'a');
                if (hasArg[j]) cout << " " << optionArgs[j];
            }
        }
        cout << endl;
    }
    return 0;
}

请添加图片描述


文章部分内容参考自:【ccf-csp题解】第1次csp认证-第三题-命令行选项-字符串模拟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1497175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Simulink系列】——控制系统仿真基础

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、控制系统基本概念 这里就不再介绍类似于开环系统、闭环系统等基本概念了&#xff01; 1、数学模型 控制系统的数学模型是指动态数学模型&#xff0c;大致…

CGAL 5.6.1 - Algebraic Foundations

1. 引言 CGAL 的目标是精确计算非线性对象&#xff0c;特别是定义在代数曲线和曲面上的对象。因此&#xff0c;表示多项式、代数扩展和有限域的类型在相关的实现中扮演着更加重要的角色。为了跟上这些变化&#xff0c;我们引入了这个软件包。由于引入的框架必须特别支持多项式…

基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户&#xff0c;我们通常会选择CICD工具来减少人力投入产生的成本&#xff0c;开源的工具比如有成熟的Jenkins&#xff0c;但是本文讲的是阿里云提高的解决方案云效平台&#xff0c;通过配置流水线的形式实现项目的快速部署到服务器…

PostgreSQL开发与实战(6.2)体系结构2

作者&#xff1a;太阳 二、逻辑架构 graph TD A[database] -->B(schema) B -->C[表] B -->D[视图] B -->E[触发器] C -->F[索引] tablespace 三、内存结构 Postgres内存结构主要分为 共享内存 与 本地内存 两部分。共享内存为所有的 background process提供内…

【Python】5. 基础语法(3) -- 函数篇

函数 函数是什么 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数, 比如 y sin x , x 取不同的值, y 就会得到不同的结果. 编程中的函数, 是一段可以被重复使用的代码片段 . # 代码示例: 求数列的和 # 1. 求 1 - 100 的和 sum 0 for i in range(1, 101):sum i…

Debian篇——系统安装在SD卡上如何调整系统分区大小

背景&#xff1a;我的SD卡是128G的&#xff0c;开发商安装好系统后&#xff0c;我发现SD的系统分区才8.9G空间&#xff08;剩下的108G未分区&#xff09;&#xff0c;不够使用&#xff0c;于是需要调整系统分区的大小。 1.查看系统盘挂载情况 df -h 2.查看系统盘在哪个分区 …

Windows系统搭建VisualSVN并结合内网穿透实现远程访问本地服务

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

如何在Win系统部署Tomcat服务并实现远程访问内网站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学…

基于梯度提升树实现波士顿房价预测

基于梯度提升树实现波士顿房价预测 将波士顿房价数据集拆分成训练集和测试集&#xff0c;搭建gbdt_1、gbdt_2和gbdt_3三个梯度提升树模型&#xff0c;分布设置超参数n_estimators为50、100、150。各自对训练集进行训练&#xff0c;然后分别对训练集和测试集进行预测。输出以下…

力扣新思路:改变字符串进行返回操作

我们在对字符串进行判断操作和返回操作时&#xff0c;可以增加\0来简化返回操作 char* longestCommonPrefix(char** strs, int strsSize) {if(strsSize0){return"";}for(int i0;i<strlen(strs[0]);i){for(int j1;j<strsSize;j){if(strs[0][i]!strs[j][i]) {s…

掀桌子了!20万左右的混动SUV,千万别乱选

文 | AUTO芯球 作者 | 雷歌 又掀桌子了&#xff01; 比亚迪秦PLUS掀翻了混动轿车圈的桌子后&#xff0c;又来掀混动SUV的桌子了。 而且掀桌子的还不只一家&#xff0c;比亚迪掀完奇瑞掀。 比亚迪唐DM-i以17.98万起售的价格&#xff0c;掀掉了中型混动SUV的桌子&#xff0c;…

springboot247人事管理系统

人事管理系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;问卷信息因为其管理内容繁杂&#xff0c;管理数量繁多导…

美团面试拷打:Redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

目录&#xff1a; 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨…

okHttp MediaType MIME格式详解

一、介绍 我们在做数据上传时&#xff0c;经常会用到Okhttp的开源库&#xff0c;okhttp开源库也遵循html提交的MIME数据格式。 所以我们经常会看到applicaiton/json这样的格式在传。 但是如果涉及到其他文件等就需要详细的数据格式&#xff0c;否则服务端无法解析 二、okHt…

滞销番茄变废为宝,成功打造市场份额第一番茄品牌|日本极致产品力

可果美是日本市场领先的番茄品牌&#xff0c;然而在可果美发展初期&#xff0c;番茄只是供应链中的滞销产品。可果美通过极致产品力的打造&#xff0c;将番茄“变废为宝”&#xff0c;打败亨氏、味好美成为可果美的招牌。可果美是如何做到的呢? 番茄是可果美供应链的滞销品 在…

MCU中断里使用软延时函数delay_ms(u16 x)问题及实例探讨

原贴有误已删&#xff1a;https://blog.csdn.net/weixin_50007421/article/details/136138221 今天完善如下&#xff1a; 本意&#xff1a;只是想表达“复杂系统中断里当然尽量不用软延时函数&#xff0c;但简单系统只要心中有数逻辑清楚实测无妨就完全可行”。 但后来感觉还…

Linux基础命令[11]-find

文章目录 1. find 命令说明2. find 命令语法3. find 命令示例3.1 不加参数3.2 按照时间3.3 -empty&#xff08;空白文件或目录&#xff09;3.4 -name&#xff08;名称查找&#xff09;3.5 -size&#xff08;大小查找&#xff09;3.6 -type&#xff08;类型查找&#xff09;3.7 …

【中间件】docker的安装

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 .卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \doc…

数据结构:顺序表的奥秘

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&a…

数据库设计说明书-word

2 数据库环境说明 3 数据库的命名规则 4 逻辑设计 5 物理设计 5.1 表汇总 5.2 表结构设计 6 数据规划 6.1 表空间设计 6.2 数据文件设计 6.3 表、索引分区设计 6.4 优化方法 7 安全性设计 7.1 防止用户直接操作数据库 7.2 用户帐号加密处理 7.3 角色与权限控制 8 数据库管理与维…