C++可执行文件参数解析

前言

针对简单工程甚至是单cpp文件,C++可执行二进制的参数获取,getopt被用来解析命令行选项参数。该接口在unix的头文件<unistd.h>中定义。参数类型区分为短参数(只有一个中划线’-')、长参数(有2个中划线‘–’),接口函数不同。另外我们也可以采用第三方库来实现参数解析。下面逐一介绍。

getopt短参数解析

短参数是指二进制的参数以‘-’为开始的参数形式。例如:.\paras.exe -o /a/b/c -d 123 -v 2。注意参数和参数值之间没有‘=’符号,是空格。
接口原型: int getopt(int argc, char *const argv[], const char *optstring, int *ind);
说明:
+ int argc:从 main 函数传入的参数数量。
+ char *const argv[]:从 main 函数传入的参数数组。
+ const char *optstring:选项字符串,用于指定哪些选项是有效的。
+ int *ind:可选参数,用于记录解析的位置。
使用方法:

#include <stdio.h>
#include <unistd.h>namespace
{// short getopt example with three parameters, just like "hvo".not support "--" long options.// input:  .\paras.exe -o /a/b/c -d 123 -v 2// output: //      Output file set to /a/b/c//      depth set to 123//      Version set to 2int ExplainParametersWithoutGetOpt(int argc, char **argv){int ret = 0;int option;while ((option = getopt(argc, argv, "hv:o:d:")) != -1) {switch (option) {case 'h':printf("Help option selected.\n");break;case 'v':printf("Version set to %s\n", optarg);break;case 'o':printf("Output file set to %s\n", optarg);break;case 'd':printf("depth set to %s\n", optarg);break;case '?':printf("Unknown option '%c'.\n", optopt);ret = 1;break;default:printf("Unknown option.\n");ret = 1;break;}}return ret;}
}int main(int argc, char **argv)
{int ret = ExplainParametersWithoutGetOpt(argc, argv);return ret;
}

getopt_long长参数解析

getopt_long不但支持短参还支持长参解析。
长参数是指二进制的参数以‘–’(2个短横)为开始的参数形式。
**接口原型:**int getopt_long(int argc, char *const argv[], const char *shortopts,
const struct option *longopts, int *longindex);
接口参数:

  • argc 和 argv:这两个参数与 main 函数中的参数一致,分别表示命令行参数的数量和参数数组。
  • shortopts:这是一个字符串,表示短选项的格式。例如,“ab:c::” 表示 a 是无参数选项,b 是带必需参数的选项,c 是带可选参数的选项。
  • longopts:这是一个指向 struct option 数组的指针,用于定义长选项的格式。每个 struct option 结构体包含以下字段: name:长选项的名称。
  • has_arg:指示选项是否带参数,0 表示无参数,1 表示必需参数,2
    表示可选参数。
  • flag:如果为 NULL,则 getopt_long 返回 val;否则,返回 0,并将 val 存储到 flag
    指向的变量中。
  • val:将要返回的值或存储到 flag 指向的变量中的值。
  • longindex:这是一个指向整数的指针,用于返回长选项在 longopts 数组中的索引。通常设置为 NULL。

返回值
如果遇到有效的短选项或长选项,getopt_long 返回该选项的字符(对于短选项)或 val(对于长选项)。如果所有选项都已处理完毕,返回 -1。
使用方法:

#include <cstdio>
#include <getopt.h>
#include <unistd.h>static struct option long_options[] = {{"help", no_argument, nullptr, 'h'},{"version", required_argument, nullptr, 'v'},{"output", required_argument, nullptr, 'o'},{0, 0, 0, 0}
};int main(int argc, char *argv[]) {int option_index = 0;int c;int ret = 0;// binary execute: .\longgetopt.exe --version 2 --output d:\temp or .\longgetopt.exe -v 2 -o d:\temp// output: //      Verbosity set to 2//      Output file set to d:\tempwhile ((c = getopt_long(argc, argv, "hv:o:", long_options, &option_index)) != -1) {switch (c) {case 'h':printf("Help option selected.\n");break;case 'v':printf("Verbosity set to %s\n", optarg);break;case 'o':printf("Output file set to %s\n", optarg);break;case '?':printf("Unknown option '%c'.\n", optopt);ret = 1;break;default:printf("Unknown option.\n");ret = 1;break;}}return ret;
}

第三方库getopt解析

github有一个2016年的工程getopt, 封装了getopt,直接头文件引用就可以了。遗憾的是8年了没有更新。但学习C++参数解析够用了。
克隆代码到demo目录,目录层级如下;

$ tree -l
.paras
|-- paras.cpp
`-- thirdparty`-- getopt|-- README.md|-- demo.cc|-- getopt.cpp`-- getopt.hpp

应用代码:

#include <iostream>
// #include <string>
#include "thirdparty/getopt/getopt.hpp"namespace
{void ExplainParametersWithGetOpt(){// - No initialization required: (argc, argv) pair automatically retrieved.// - First argument is default option value, then all option indentifiers follow.//  binary execute: .\paras.exe -o=/a/b/c -d=123 -v=2// output: 0,/a/b/c,123,2bool help = getarg(false, "-h", "--help", "-?");int version = getarg(0, "-v", "--version", "--show-version");int depth = getarg(1, "-d", "--depth", "--max-depth");std::string file = getarg("", "-o", "--outputfile");std::cout << help << ',' << file << ',' << depth << ',' << version << std::endl;}
}int main()
{std::cout << "Explain parameters with getopt lib" << std::endl;ExplainParametersWithGetOpt();return 0;
}

使用分析:第三方库getopt参数是短参接‘=‘,再接参数值形式。‘=‘不能省。少了一些全局变量。

总结

对于指定二进制或单个cpp,最终二进制启动参数的解析可以使用多种方法,看你的使用习惯。一般长短参都支持,程序的友好性较高。第三方包功能单一,若有更高需要,可以自己扩充。

参考文献

[1] getopt与getopt_long, slmmlk2011_2
h,ttps://blog.csdn.net/slmmlk2011_2/article/details/7964218?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-7964218-blog-142920234.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-7964218-blog-142920234.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=2

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

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

相关文章

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

记一次某企业管理系统通用SQL注入挖掘

更多视频教程可看主页和专栏 目录: 一、资产发现 二、通用漏洞挖掘 三、通用漏洞经验总结 一、资产发现 通过漏洞挖掘过程中发现该系统存在sql注入 1.二话不说先来个单引号显示 ‘011111111111111’’) ) 再来一个单号试一试可不可以把他闭合掉 换成报错注入的poc 发现右边…

Mybatis 如何复用 SQL

比如你的Mapper是这样写的&#xff1a; 但这个接口是没有分页的&#xff0c;你还想再写一个有分页的查询接口&#xff0c;两个接口SQL一模一样&#xff0c;只是多了分页特性。你可以直接重载一个方法&#xff0c;增加分页参数&#xff0c;即可复用该SQL。如下&#xff1a;

Redis 介绍和安装

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis 入门介绍 收录于专栏[redis] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 本章将带领读者进入 Redis 的世…

快速解决VRay渲染慢问题

在3D设计与渲染领域&#xff0c;VRay渲染器无疑是一款强大且广泛使用的工具&#xff0c;但很多小伙伴在使用它进行 CPU 渲染时&#xff0c;都遇到过速度慢得让人抓狂的情况。今天&#xff0c;我就来给大家分享两套切实可行的解决方案。 当我们将 VRay渲染器与 DMAX或Maya搭配使…

《庐山派从入门到...》PWM板载蜂鸣器

《庐山派从入门到...》PWM板载蜂鸣器 配置PWM模块控制板载无源蜂鸣器播放【一闪一闪亮晶晶】播放do re mi 《庐山派从入门到...》PWM控制无源蜂鸣器 PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09;是一种在嵌入式系统中常用的技术&#xff0c;它可以用…

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数

【C语言】函数指针与指针函数 文章目录 [TOC](文章目录) 前言一、指针数组二、数组指针三、函数指针四、指针函数五、函数指针数组六、回调函数七、参考资料总结 前言 使用工具&#xff1a; 1.DEVC 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、…

【Leetcode】1705. 吃苹果的最大数目

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 有一棵特殊的苹果树&#xff0c;一连 n n n 天&#xff0c;每天都可以长出若干个苹果。在第 i i i 天&#xff0c;树上会长出 a p p l e s [ i ] apples[i] apples[i] 个苹果&a…

使用 HTML 和 CSS 实现绚丽的节日烟花效果

文章目录 1. 效果预览2. 核心技术栈3. 核心代码解读3.1 HTML结构3.2 霓虹文字的CSS样式3.2.1 核心样式代码3.2.2 动画效果 3.3 JavaScript 的烟花效果实现3.3.1 烟花上升3.3.2 粒子爆炸 4. 用户交互5. 运行步骤总结 1. 效果预览 打开后输入文本的展示内容 用户点击页面后播放…

基于openEuler22.09部署OpenStack Yoga云平台(一)

OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署&#xff0c;三个节点分别是控制节点&#xff08;controller&#xff09;、计算节点&#xff08;compute&#xff09;、存储节点&#xff08;storage&#xff09;&#xff0c;其中存储…

国自然面上项目分享|基于人工智能和病理组学的早癌筛查算法研究|基金申请·24-12-24

小罗碎碎念 今天分享的项目为【常规面上项目】&#xff0c;执行年限为2018年1月至2021年12月&#xff0c;直接费用为55万元。 今天分享的这个项目很有意思&#xff0c;因为这个项目的成果是团队2020年申报基金委优青的材料&#xff0c;并且还有临床验证和商业转化&#xff0c;值…

SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、黑翅鸢算法BKA 黑翅鸢算法&#xff08;Black-winged kite algorithm&#xff0c;BKA&#xff09;由Wang Jun等人于2024年提出&#xff0c;该算法受黑翅鸢的迁徙和掠食行为启发而得。BKA集成了柯西突变策略和领导者策略&#xff0c;增强了算法的全局搜索能力&#xff0c;提…

41 stack类与queue类

目录 一、简介 &#xff08;一&#xff09;stack类 &#xff08;二&#xff09;queue类 二、使用与模拟实现 &#xff08;一&#xff09;stack类 1、使用 2、OJ题 &#xff08;1&#xff09;最小栈 &#xff08;2&#xff09;栈的弹出压入序列 &#xff08;3&#xf…

【笔记】深度学习模型评估指标

推荐链接&#xff1a; &#xff08;0&#xff09;多分类器的评价指标 &#xff08;1&#xff09;泛化误差的评价方法&#xff1a;【机器学习】模型评估与选择&#xff08;留出法、交叉验证法、查全率、查准率、偏差、方差&#xff09; &#xff08;2&#xff09;机器学习&…

Linux运维常见命令

vi/vim快捷键使用 1)拷贝当前行 yy ,拷贝当前行向下的5行 5yy&#xff0c;并粘贴&#xff08;输入p&#xff09;。 2)删除当前行 dd ,删除当前行向下的5行5dd 3)在文件中查找某个单词 [命令行下 /关键字&#xff0c;回车查找 ,输入n就是查找下一个 ] 4)设置文件的行号&…

评估大语言模型在药物基因组学问答任务中的表现:PGxQA

​这篇文献主要介绍了一个名为PGxQA的资源&#xff0c;用于评估大语言模型&#xff08;LLM&#xff09;在药物基因组学问答任务中的表现。 研究背景 药物基因组学&#xff08;Pharmacogenomics, PGx&#xff09;是精准医学中最有前景的领域之一&#xff0c;通过基因指导的治疗…

AI芯片常见概念

文章目录 AI芯片常见概念前言常见概念AI芯片分类按照芯片的技术架构分GPU半定制化的 FPGA全定制化 ASIC神经拟态芯片 按应用场景分训练卡推理卡 按部署位置分国产AI卡资料汇总 AI芯片算力和能效比AI芯片算力AI芯片能效比 封装相关Chiplet技术3DIC三星多芯片集成联盟&#xff08…

SpringBoot中使用AOP切面编程实现登录拦截

使用AOP切面编程实现登录拦截 1. 首先实现一个登录注册功能 以下代码仅供参考 控制层 RestController RequestMapping("/user") public class UserController {Autowiredprivate UserService userService;PostMapping("/register")public Result regis…