【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>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值