C++ 命令行参数解析
文章目录
- 说明
- 短参数之 getopt()
- 长参数之 getopt_long()
- 长参数之 getopt_long_only()
说明
主要参考以下博客:
博客一:getopt和getopt_long函数
博客二:C++中如何自定义命令行参数——完整实例演示
博客三:使用 Qt 解析命令行参数
博客四:linux c/c++中getopt的使用
短参数之 getopt()
头文件:#include <unistd.h>
函数原型:int getopt(int argc, char * const argv[], const char *optstring);
参数解释:
[param1] argc: main 函数的 argc
[param2] argv: main 函数的 argv
[param3] optstring: 格式控制符。"ab:c:d"代表 -b 和 -b 后面必须跟一个参数,而 -a 和 -d 不需要参数
相关变量:
extern char *optarg; 表示参数的具体内容
extern int optind; 表下一个将被处理到的参数在 argv 中的下标值
extern int opterr;
extern int optopt;
测试案例:
// Opt.cpp
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>// 短参数测试案例
void testGetOpt(int argc, char *argv[]) {int opt; // getopt() 的返回值const char *optstring = "a:b:c:d"; // 设置短参数类型及是否需要参数while ((opt = getopt(argc, argv, optstring)) != -1) {printf("opt = %c\n", opt); // 命令参数,亦即 -a -b -c -dprintf("optarg = %s\n", optarg); // 参数内容printf("optind = %d\n", optind); // 下一个被处理的下标值printf("argv[optind - 1] = %s\n\n", argv[optind - 1]); // 参数内容}
}int main(int argc, char *argv[]) {testGetOpt(argc, argv);return 0;
}
正确的使用方法(√):
[User@ubuntu:~/Desktop]$ opt.exe -a a_para -b b_para -c c_para -d # 参数全用
[User@ubuntu:~/Desktop]$ opt.exe -a a_para -b b_para -d # 部分参数
[User@ubuntu:~/Desktop]$ opt.exe -b b_para -a a_para # 可以倒序
[User@ubuntu:~/Desktop]$ opt.exe # 可以无参
错误的使用方法(×):
[User@ubuntu:~/Desktop]$ opt.exe -a # -a 后面没有跟参数
[User@ubuntu:~/Desktop]$ opt.exe -a a_para -d d_para # -d 后面跟了参数
长参数之 getopt_long()
头文件:#include <getopt.h>
函数原型:int getopt(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
参数解释:
[param1] argc: main 函数的 argc
[param2] argv: main 函数的 argv
[param3] optstring: 格式控制符
[param4] longopts: 一个由option结构体组成的数组,数组的每个元素,指明了一个“长参数”(即形如–name的参数)名称和性质
[param5] longindex: 如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值
相关变量:
同上
测试案例:
// Opt.cpp
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>// 长参数测试案例
void testGetOptLong(int argc, char *argv[]) {int opt; // getopt_long() 的返回值int digit_optind = 0; // 设置短参数类型及是否需要参数// 如果option_index非空,它指向的变量将记录当前找到参数符合long_opts里的// 第几个元素的描述,即是long_opts的下标值int option_index = 0;// 设置短参数类型及是否需要参数const char *optstring = "ab:nr:"; // 设置长参数类型及其简写,比如 --reqarg <==>-r/*struct option {const char * name; // 参数的名称int has_arg; // 是否带参数值,有三种:no_argument, required_argument,optional_argumentint * flag; // 为空时,函数直接将 val 的数值从getopt_long的返回值返回出去,// 当非空时,val的值会被赋到 flag 指向的整型数中,而函数返回值为0int val; // 用于指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值};其中:no_argument(即0),表明这个长参数不带参数(即不带数值,如:--name)required_argument(即1),表明这个长参数必须带参数(即必须带数值,如:--name Bob)optional_argument(即2),表明这个长参数后面带的参数是可选的,(即--name和--name Bob均可)*/static struct option long_options[] = {{"reqarg", required_argument, NULL, 'r'},{"noarg", no_argument, NULL, 'n'},{"optarg", optional_argument, NULL, 'o'},{0, 0, 0, 0} // 添加 {0, 0, 0, 0} 是为了防止输入空值};while ( (opt = getopt_long(argc,argv,optstring,long_options,&option_index)) != -1) {printf("opt = %c\n", opt); // 命令参数,亦即 -a -b -n -rprintf("optarg = %s\n", optarg); // 参数内容printf("optind = %d\n", optind); // 下一个被处理的下标值printf("argv[optind - 1] = %s\n", argv[optind - 1]); // 参数内容printf("option_index = %d\n", option_index); // 当前打印参数的下标值printf("\n");}
}int main(int argc, char *argv[]) {testGetOptLong(argc, argv);return 0;
}
正确的使用方法(√):
[User@ubuntu:~/Desktop]$ opt.exe -a -b b_para -n -r r_para # 全部使用
[User@ubuntu:~/Desktop]$ opt.exe -a # 部分参数
[User@ubuntu:~/Desktop]$ opt.exe -a -b b_para # 部分参数
[User@ubuntu:~/Desktop]$ opt.exe -a -b b_para -n # 部分参数
[User@ubuntu:~/Desktop]$ opt.exe -n -r r_para # 部分参数
[User@ubuntu:~/Desktop]$ opt.exe -a --noarg --reqarg required_para # 长参数
错误的使用方法(×):
[User@ubuntu:~/Desktop]$ opt.exe -a -b -n -r required_para # -b 没有跟参数
注意事项:一般地,不要将短参数的 optstring 和长参数的 struct option 的 val 设置为一样的字母,这样易于区分!!!
长参数之 getopt_long_only()
头文件:#include <unistd.h>
函数原型:int getopt(int argc, char * const argv[], const char *optstring, const struct option *long_opts, int *longindex);
与 getopt_long() 的区别:
- 该函数与 getopt_long() 函数使用相同的参数表,在功能上基本一致
- 只是 getopt_long() 只将 --name 当作长参数,但 getopt_long_only() 会将 --name 和 -name 两种选项都当作长参数来匹配
- getopt_long() 在遇到 -name 时,会拆解成 -n -a -m -e 到 optstring 中进行匹配,而 getopt_long_only() 只在 -name 不能在longopts() 中匹配时才将其拆解成 -n -a -m -e 这样的参数到 optstring 中进行匹配
C++ 命令行参数解析相关推荐
- 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现
参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] ...
- python命令行参数解析OptionParser类用法实例
python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下: from opt ...
- 3gpp文件头文件解析_居于LLVM 的命令行参数解析
在写命令行程序的时候经常需要解析各种命令行参数.打印help信息等,觉得非常的麻烦.今天介绍一种超级棒的命令参数解析的方法:居于LLVM 的命令行参数解析,有了它妈妈再也不用担心我不会解析命令行参数^ ...
- Python命令行参数解析模块------argparse
首先,argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广 ...
- 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出
写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...
- Python中最好用的命令行参数解析工具
Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...
- python 命令行参数-Python 中最好用的命令行参数解析工具
Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要一个命令行参数解析的 ...
- linux shell中的命令自动补全(compgen complete)与 命令行参数解析
linux shell中的命令自动补全(compgen complete)与 命令行参数解析 标签: shell脚本 2013-12-31 21:56 6661人阅读 评论(6) 收藏 举报 分类: ...
- GO标准库—命令行参数解析FLAG
评论有人提到没有例子,不知道讲的是什么.因此,为了大家能够更好地理解,特意加了一个示例.其实本文更多讲解的是 flag 的实现原理,加上示例之后,就更好地知道怎么使用了.建议阅读 <Go语言标准 ...
- Python命令行参数解析模块getopt使用实例
这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...
最新文章
- 安全、稳定、可靠甲骨文定义PaaS新时代
- Python中的GIL(全局解释器锁)
- 评《认知红利》 谢春霖著
- GPS基站架设完整操作流程
- vue配置git的子模块
- vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
- 动画分析步骤“三步曲”
- 八种样本抽样方法介绍
- win2012 加入域
- shell下office、html、pdf文档互转方法
- python好学吗-python容易学么
- Vue设计模式,发布订阅,响应式原理(简略版)
- 卷积神经网络(CNN)图像识别知识总结
- # Can you find the english grammer mistakes in these sentences? csdn
- 苏宁易购工作怎么样_福建苏宁总经理感恩节家访 给老会员送免费清洗家电福利...
- 韦东山嵌入式第一期学习笔记DAY_2——6_2_使用eop烧写裸板程序
- 远程办公将常态化?宅家也能轻松连接办公电脑、ERP、NAS、数据库
- 打印机打印列队中打印状态为错误的解决方式之一
- 如何应用深度学习技术解决金融预测、风险等领域?学习复盘:七月在线金融AI高级训练营
- 唯样商城:氧化膜电阻和碳膜电阻有哪些区别