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

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.mzph.cn/news/727021.shtml

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

相关文章

mongodb 图形界面工具 -- Studio 3T(下载、安装、连接mongodb数据库)

目录 mongodb 图形界面工具 -- Studio 3T下载安装第一次使用&#xff1a;注册添加一个连接&#xff08;连接 mongodb 数据库&#xff09;1、点击【添加新连接】&#xff0c;选择【手动配置我的连接设置】2、对 Server 设置连接数据3、连接的用户认证设置&#xff08;创建数据库…

航芯1-Wire安全认证新品上市,防抄板和耗材认证高性价比之选

随着用户产品附加值提升带来的对防抄板的需求&#xff0c;以及电池、医疗耗材、电子配件、IOT领域中对设备认证的需求&#xff0c;上海航芯经过多年的技术积累和对市场的理解&#xff0c;推出了高性价比的ACL16_Axx系列。 1-Wire单总线&#xff1a;小尺寸实现高效传输 ACL16_…

JAVA WEB开发 错误:无效发行版解决办法

1.首先查询本安装的jdk版本 在cmd中输入如下指令 2.打开file——progect structure 2.将这两处保持一致即可

一图看懂:什么是“新质生产力”?

◆2023年9月&#xff0c;首次提出“新质生产力”。 ◆2024年1月&#xff0c;强调“加快发展新质生产力&#xff0c;扎实推进高质量发展”。 ◆2024年3月&#xff0c;《政府工作报告》中提出&#xff0c;要大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。充分发挥…

SpringBoot【问题 05】PostgreSQL数据库启用SSL后使用默认配置进行数据库连接(Navicat工具与Java程序)

官网SSL说明&#xff1a;https://www.postgresql.org/docs/9.1/libpq-ssl.html 1.配置 1.1 文件 使用SSL需要的4个文件&#xff0c;名称要一致&#xff1a; 客户端密钥&#xff1a;postgresql.keyJava客户端密钥&#xff1a;postgresql.pk8客户端证书&#xff1a;postgresq…

阿里云2核4G服务器支持人数并发测试,2核4G主机测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

进制之间的转换

文章目录 编译过程进制转换1、进制的概念1.1 二进制1.2 八进制1.3 十六进制 进制在程序中的表现方式十进制转二进制将十进制转换成二进制&#xff08;除2反序取余法&#xff09;二进制转十进制&#xff08;权值法&#xff09; 八进制转十进制将十进制转换成八进制(除8反序取余法…

医药行业五大难题深度剖析:CRM解决方案助力突围

医疗行业关系着民生、经济乃至战备&#xff0c;是国民经济的重要组成部分。虽然近20年来我国医疗行业年均增长率维持在15%之上&#xff0c;但行业发展仍存在诸多问题。引进CRM管理系统可能是一个行之有效的解决方法。文中将为您整理医疗行业目前的五大挑战&#xff0c;以及CRM如…

Android Termux系统安装openssh实现公网使用SFTP远程访问

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

判断连续数据同意特征的方法:插旗法

bool isMonotonic(int* nums, int numsSize) {int flag 2;for (int i 1; i < numsSize; i) {if (nums[i-1] > nums[i]) {if (flag 0)return false;flag 1;}else if (nums[i-1] < nums[i]) {if (flag 1)return false;flag 0;}}return true; }此代码较为简单&…

Sora:AI视频生成的新机遇与挑战

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术已经深入渗透到社会的各个领域。其中&#xff0c;Sora这类基于AI的视频生成工具因其高度逼真的生成能力而备受瞩目。然而&#xff0c;正如一枚硬币有两面&#xff0…

nVisual+AI实现综合布线智能化运维管理

传统的综合布线系统依据TIA-606规范在配线架、跳线、面板上都粘贴了标签&#xff0c;标签作为一个综合布线项目中元器件的唯一标识&#xff0c;对综合布线日常运维管理过程中查询连接关系、定位设备位置至关重要&#xff0c;但标签所能记录的信息毕竟有限&#xff0c;因此可视化…

docker的简单使用

在一些进行使用靶场或者工具的时候&#xff0c;我们可以用docker在线拉取&#xff0c;就可以省去手动搭建靶场的过程 一、docker的配置 因为docker是默认从docker的官网进行拉取&#xff0c;所以拉取经常速度很慢或者失败&#xff0c;我们先要进行一下配置&#xff0c;让他优…

让照片说话唱歌的软件,盘点这3款!

在数字时代&#xff0c;我们总是渴望找到新的方式来表达自我、分享生活。近年来&#xff0c;随着人工智能和图像处理技术的飞速发展&#xff0c;一种新型的软件应运而生&#xff0c;它们能够让照片“说话”甚至“唱歌”&#xff0c;给我们的生活带来了无限乐趣和创意空间。那么…

探索SRM软件:了解SRM在企业中的作用

作为供应商&#xff0c;对于SRM软件并不陌生&#xff0c;但对于刚刚进入采购行业的新手来说&#xff0c;就可能不太了解这个软件的作用了。现在让我们来科普一下&#xff1a;通常&#xff0c;我们将SRM称为供应商关系管理&#xff0c;其全称为Supplier Relationship Management…

ICVQUANTUMCHINA报告:《2024全球量子通信与安全产业发展展望》发布

2月26日&#xff0c;《2024全球量子通信与安全产业发展展望》的中文版报告通过光子盒官方平台发布&#xff0c;英文版报告通过ICV官方平台发布。 英文版报告获取地址&#xff1a; https://www.icvtank.com/newsinfo/898270.html 亮点 摘要 - 量子通信与安全产业报告呈现了2023…

zerotier局域网组建 笔记

背景 家里的windows电脑&#xff1a;home-win10-pc 家里的windows电脑上vmware运行的ubuntu虚拟机&#xff1a;home-ubuntu-vm 公司的mac电脑&#xff1a;company-mac-pc 由于xxx需求&#xff0c;需要组建一个局域网&#xff0c;前东家都是用的zerotier&#xff0c;出于路径依…

FreeRTOS操作系统学习——任务管理

任务概念 在FreeRTOS中&#xff0c;一个任务相当于一个线程&#xff0c;可以有很多的任务&#xff0c;每个人任务可以设置不同的优先级。相同优先级的任务轮流使用CPU&#xff0c;高优先级的任务可以一直使用CPU&#xff0c;直到主动放弃&#xff0c;低级的任务才有被执行的机…

国产蓝鹏测控测径仪如何?

随着国力增强&#xff0c;中国制造品质提升&#xff0c;不仅仅是国外更多人认可&#xff0c;国内对国产制品也接受良好&#xff0c;测径仪这种智能测量设备&#xff0c;很多国内外厂家也在用国产设备。 测径仪厂家 蓝鹏测控作为智能几何尺寸测量仪生产厂家&#xff0c;已有10多…