getopt_long 函数的使用

news2024/11/15 5:45:56

        getopt_long 函数的使用网上已经有很多了,这里只是记录一下方便自己后续查找。首先函数原型声明:

#include <getopt.h>

int getopt_long(int argc, char *argv[],
		  const char *optstring,
		  const struct option *longopts, int *longindex);

函数是用于解析命令行参数的,与函数 getopt() 函数是相似的,它可以处理长选项,即两个短杠"--" 连接的参数选项。而且比 getopt() 多两个参数。

参数说明:

1,argc        一般就是 main 函数里的 argc

2,argv    同上

3,optstring  要匹配的参数,如:"ha" 或  "h:a" 或 "h:a::",带一个冒号的表示此选项须带参数,两个冒号的表示是可选参数

4,longopts 这个是长选项结构的指针,一般传的是数组

5,longindex  如果不为空,它将指向 longopts 的一个元素的位置,即longopts的数组下标

结构体类型 struct option 声明为:

struct option {
   const char *name; /*这个就是长选项的名称*/
   int         has_arg; /*指示是否带参数*/
   int        *flag;
   int         val; /*如果flag=NULL, 匹配到时返回这个值*/
};

name   is the name of the long option.

has_arg
	  is: no_argument (or 0) if the option does not take an
	  argument; required_argument (or 1) if the option requires
	  an argument; or optional_argument (or 2) if the option
	  takes an optional argument.

flag   specifies how results are returned for a long option.  If
	  flag is NULL, then getopt_long() returns val.  (For
	  example, the calling program may set val to the equivalent
	  short option character.)  Otherwise, getopt_long() returns
	  0, and flag points to a variable which is set to val if
	  the option is found, but left unchanged if the option is
	  not found.

val    is the value to return, or to load into the variable
	  pointed to by flag.

 直接用 man 手册上的例子说明:

#include <getopt.h>
#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */

int main(int argc, char *argv[])
{
	int c;
	int digit_optind = 0;

	while (1) {
		int this_option_optind = optind ? optind : 1;
		int option_index = 0;
		
		/*长选项的匹配只要匹配到前n个字符相同就会返回,若是模棱两可时会返回?,同时stderr会有相应打印*/
		static struct option long_options[] = {
		   {"add",     required_argument, 0,  0 },
		   {"append",  no_argument,       0,  0 },
		   {"delete",  required_argument, 0,  0 },
		   {"verbose", no_argument,       0,  0 },
		   {"create",  required_argument, 0, 'c'},
		   {"file",    required_argument, 0,  0 },
		   {0,         0,                 0,  0 }
	   };
		
		/*短选项跟一个冒号表示有选项参数,两个冒号表示选项参数可选*/
	   c = getopt_long(argc, argv, "abc:d:012",
					   long_options, &option_index);
	   if (c == -1)
		   break;

	   switch (c) {
	   case 0: /* 匹配到长选项时,返回的val,即struct optaion 中的 val,这里为 0 则表示匹配到 add、append, delete, verbose, file时都会跟到这个 case, 而create 则匹配到字符'c'*/
			printf("get option_index = %d, option %s", option_index, long_options[option_index].name);
			if (optarg)
			   printf(" with arg %s", optarg);
			printf("\n");
			break;

	   case '0':
	   case '1':
	   case '2':
			if (digit_optind != 0 && digit_optind != this_option_optind)
			 printf("digits occur in two different argv-elements.\n");
			digit_optind = this_option_optind;
			printf("option %c\n", c);
			break;

	   case 'a':
			printf("option a\n");
			break;

	   case 'b':
			printf("option b\n");
			break;

	   case 'c':
			printf("option c with value '%s'\n", optarg);
			break;

	   case 'd':
			printf("option d with value '%s'\n", optarg);
			break;

	   case '?': /*ambiguous 模棱两可的时候返回? 如只输入 --a 则会匹配到 add 和 append*/
			printf("it's ambiguous, please selete one\n");
			break;
		
	   default:
			printf("?? getopt returned character code 0%o ??\n", c);
	   }
	}

	if (optind < argc) {
		printf("non-option ARGV-elements: ");
		while (optind < argc)
		   printf("%s ", argv[optind++]);
		printf("\n");
	}

	exit(EXIT_SUCCESS);
}

getopt_long() 函数支持短选项和长选项,如:

 

可以看到短选项时,如果需要带参数, 参数可以直接紧跟选项或是位于空格之后 。而长选项则需要加"=",如:

长选项只要匹配到前n(n<=strlen(name))个字符就可以。如果有多个匹配到则返回 ?,同时stderr 会有输出信息。这个函数里涉及到的全局变量:

1,optind  表示在argv中要处理的下一个元素的索引

2,optarg 当匹配到选项时,它指向的就是选项的参数,如上面的iii, jj, aa, 000

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

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

相关文章

Navicat使用导入向导批量插入数据到数据库

Mybatis,"可持久层数据库框架" Html,"超文本标记语言" Css,"网页外设计语言" JavaScript,"用户行为交互" Jquery,"提升网页开发效率的一种框架" Vue,"前端开发框架" Vant,"前开发预装组件库" git,"…

SM2算法对比RSA算法,有哪些优势?

SM2算法和RSA算法都是公钥密码算法&#xff0c;SM2算法是一种更先进安全的算法&#xff0c;在安全性能、速度性能等方面都优于RSA算法&#xff0c;在我国商用密码体系中被用来替换RSA算法。国家密码管理局于2010年12月17日发布了SM2算法&#xff0c;并要求现有的基于RSA算法的电…

《面试1v1》Redis基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Golang/Python 调用 openAI 的API 详解

学习目标&#xff1a; OpenAI API介绍 学习如何通过 Golang 使用 OpenAI 的 API OpenAI 的常用的参数及其说明 了解OpenAI API 中令牌&#xff08;tokens) OpenAI API 提供了几个不同的终端点&#xff08;endpoints&#xff09;和模式&#xff08;modes&#xff09; 复杂和…

【已解决】Java 中导入excel时使用 trim() 无法去除空格的解决方法

使用trim无法去除空格的解决方法 一、问题描述二、原因分析三、解决方案方案一&#xff1a;使用正则表达式方案二&#xff1a;使用String.strip()方案三&#xff1a;使用 hutool的 StrUtil.trim()方法 四、总结 一、问题描述 在excel导入操作时&#xff0c;读取cell中的字符串…

自学Python 69 Selenium八大元素定位方法(新版BY方法)

Python Selenium八大元素定位方法(新版BY方法) 文章目录 Python Selenium八大元素定位方法(新版BY方法)前言一、常用的八种定位方法&#xff08;新旧对比&#xff09;二、查看网页元素三、八大元素定位示例1、id定位2、name定位3、class定位4、tag定位5、link定位6、partial_li…

MySQL - 第9节 - MySQL内外连接

目录 1.内连接 2.外连接 2.1.左外连接 2.2.右外连接 3.简单案例 1.内连接 • 表的连接分为内连接和外连接。 • 内连接实际上就是利用where 子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查…

【C++】模板初级内容(函数模板,类模板)

文章目录 前言一、函数模板1.1 函数模板概念1.2函数模板格式1.3模板的原理&#xff1a;1.4函数模板的实例化 二、类模板2.1 类模板的定义格式2.2定义与声明分离要注意的点 前言 告诉编译器一个模子&#xff0c;让编译器根据不同的类型利用该模子来生成代码 模板分为函数模板与类…

MES系统常用的数据采集网关

随着制造业的数字化转型&#xff0c;MES&#xff08;制造执行系统&#xff09;在生产过程中的重要性日益凸显。MES系统作为连接企业资源和生产现场的桥梁&#xff0c;需要实时、准确地采集和整合工业设备的数据&#xff0c;以支持生产调度、质量管理、库存控制等关键业务。为了…

探索Gradio Audio模块的change、clear和play方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

C#常见技能_封装

大家好&#xff0c;我是华山自控编程朱老师 前几天一个学员在学习C#与封装交互时,也不知道封装可以用来做什么 。下面我们就详细讲讲C# 和封装交互的相关知识。 C#是一种面向对象的编程语言&#xff0c;封装是面向对象编程中的一个重要概念&#xff0c;通过封装可以将数据和操…

CAN(1)-GD32

CAN-GD32 电路 CAN 是 Controller Area Network 的缩写,是 ISO 国际标准化的串行通信协议。 CAN总线的很多优点,使得它得到了广泛的应用,如传输速度最高到1Mbps, 通信距离最远到10km,无损位仲裁机制,多主结构。 CAN总线的标准 CAN总线标准之规定了物理层和数据链路层…

并发和并行的区别

目录 背景过程例子&#xff1a;定义&#xff1a;并发解决办法&#xff08;Redisson&#xff09;&#xff1a;解决并发步骤&#xff08;Redisson&#xff09;&#xff1a; 总结 背景 在设计Arpro第三版的时候马总提出了一个问题&#xff0c;我们认为人家表达是并发问题&#xf…

吉他如何实现内录or通过转接头和简易声卡连接电脑没有声音怎么办

目录 效果器or智能音箱 电吉他和效果器的连接 效果器和耳机or音箱连接 内录方法 为什么用6.5mm&#xff08;入&#xff09;转3.5mm&#xff08;出&#xff09;转接头内录无声音 整体连接图示 这篇文章我会以通俗的语言为初学者描述如何让电吉他“燃起来”&#xff0c;效果…

【每日算法 数据结构(C++)】—— 03 | 合并两个有序数组(解题思路、流程图、代码片段)

文章目录 01 | &#x1f451; 题目描述02 | &#x1f50b; 解题思路03 | &#x1f9e2; 代码片段 An inch of time is an inch of gold, but you can’t buy that inch of time with an inch of gold. An inch of time is an inch of gold, but you cant buy that inch of time…

mysql——存储过程

目录 存储过程存储过程的优点创建存储过程调用存储过程查看存储过程查看存储过程的详细信息查看存储过程的属性 存储过程的参数删除存储过程存储过程控制语句 存储过程 存储过程是一组为了完成特定功能的SQL语句集合存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句…

【Openvino02】openvino2022.1加速卡Movidius Myriad测试以及问题解决

接上一篇&#xff0c;上一篇我们已经把环境什么的都安装好了&#xff0c;本篇主要做一下各种模型测试&#xff0c;模型下载验证等&#xff1b;背景这里就不多说了&#xff0c;上篇已经介绍过了。 一、安装开发验证环境 1.安装所需包 这里建议用清华和豆瓣的镜像相互替换&…

4K 免费的图片素材去哪里找?这6个网站告诉你答案。

推荐几个免费高清图片素材库&#xff0c;今后再也不用为找图片而发愁了&#xff0c;建议收藏起来~ 菜鸟图库 https://www.sucai999.com/pic.html#?vNTYxMjky ​ 网站主要是为新手设计师提供免费素材的&#xff0c;素材的质量都很高&#xff0c;类别也很多&#xff0c;像平面…

C++primer(第五版)第一章(开始)

面对八百多页的C圣经《Cprimer》我陷入了沉思。最近终于下定决心把它啃下来&#xff0c;现在打算记录每章的关键点&#xff0c;一是为了巩固知识&#xff0c;二是以后要复习什么的也不用再碰那本砖头。 1.1编写一个简单的C程序 书中给了几行代码: int main() {return 0; } …

Crypto__1

编码 莫斯密码 Base编码 常见的Base64 Base32 Base16 Base64 将通过ASCLL码改成二进制数 因为64是2的6次方 所以将原文转换的二进制数分别取六位&#xff0c;不足的补0 每次取出6bit&#xff0c;按照其值选择 ABBCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123…