文章目录

  • 说明
  • 短参数之 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++ 命令行参数解析相关推荐

  1. 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

    参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] ...

  2. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  3. 3gpp文件头文件解析_居于LLVM 的命令行参数解析

    在写命令行程序的时候经常需要解析各种命令行参数.打印help信息等,觉得非常的麻烦.今天介绍一种超级棒的命令参数解析的方法:居于LLVM 的命令行参数解析,有了它妈妈再也不用担心我不会解析命令行参数^ ...

  4. Python命令行参数解析模块------argparse

      首先,argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广 ...

  5. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

  6. Python中最好用的命令行参数解析工具

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...

  7. python 命令行参数-Python 中最好用的命令行参数解析工具

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要一个命令行参数解析的 ...

  8. linux shell中的命令自动补全(compgen complete)与 命令行参数解析

    linux shell中的命令自动补全(compgen complete)与 命令行参数解析 标签: shell脚本 2013-12-31 21:56 6661人阅读 评论(6) 收藏 举报 分类: ...

  9. GO标准库—命令行参数解析FLAG

    评论有人提到没有例子,不知道讲的是什么.因此,为了大家能够更好地理解,特意加了一个示例.其实本文更多讲解的是 flag 的实现原理,加上示例之后,就更好地知道怎么使用了.建议阅读 <Go语言标准 ...

  10. Python命令行参数解析模块getopt使用实例

    这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...

最新文章

  1. 安全、稳定、可靠甲骨文定义PaaS新时代
  2. Python中的GIL(全局解释器锁)
  3. 评《认知红利》 谢春霖著
  4. GPS基站架设完整操作流程
  5. vue配置git的子模块
  6. vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
  7. 动画分析步骤“三步曲”
  8. 八种样本抽样方法介绍
  9. win2012 加入域
  10. shell下office、html、pdf文档互转方法
  11. python好学吗-python容易学么
  12. Vue设计模式,发布订阅,响应式原理(简略版)
  13. 卷积神经网络(CNN)图像识别知识总结
  14. # Can you find the english grammer mistakes in these sentences? csdn
  15. 苏宁易购工作怎么样_福建苏宁总经理感恩节家访 给老会员送免费清洗家电福利...
  16. 韦东山嵌入式第一期学习笔记DAY_2——6_2_使用eop烧写裸板程序
  17. 远程办公将常态化?宅家也能轻松连接办公电脑、ERP、NAS、数据库
  18. 打印机打印列队中打印状态为错误的解决方式之一
  19. 如何应用深度学习技术解决金融预测、风险等领域?学习复盘:七月在线金融AI高级训练营
  20. 唯样商城:氧化膜电阻和碳膜电阻有哪些区别

热门文章

  1. Linux内核4.14版本——mmc core(2)——bus模块
  2. 网页 游戏服务器连接超时,连接游戏服务器超时怎么解决
  3. 文科生 python 简书_文科生学 Python 系列 15:泰坦尼克数据 1
  4. 深入理解Flash Player的安全域
  5. poi生成Workbook转成pdf(java实现excel转pdf)
  6. c语言中的绝对值符号
  7. Android启动页设置
  8. php怎么实现收藏夹功能,前端--收藏功能的实现
  9. Linux Namespace Veth虚拟网卡
  10. Markdown 全文检索