C库函数-getopt函数总结学习

1、简介

getopt函数是命令行参数解析函数

1、1命令行组成

在这里插入图片描述
Command name 程序文件名
operands 操作对象
option 选项
option argument 选项参数
getopt()函数将传递给mian()函数的argc,argv作为参数,同时接受字符串参数optstring – optstring是由选项Option字母组成的字符串。关于optstring的格式规范简单总结如下:

  1. 单个字符,表示该选项Option不需要参数。
    (2) 单个字符后接一个冒号":“,表示该选项Option需要一个选项参数Option argument。选项参数Option argument可以紧跟在选项Option之后,或者以空格隔开。选项参数Option argument的首地址赋给optarg。
    (3) 单个字符后接两个冒号”::",表示该选项Option的选项参数Option argument是可选的。当提供了Option argument时,必须紧跟Option之后,不能以空格隔开,否则getopt()会认为该选项Option没有选项参数Option argument,optarg赋值为NULL。相反,提供了选项参数Option argument,则optarg指向Option argument。
    为了使用getopt(),我们需要在while循环中不断地调用直到其返回-1为止。每一次调用,当getopt()找到一个有效的Option的时候就会返回这个Option字符,并设置几个全局变量。
    *char optarg -- 当匹配一个选项后,如果该选项带选项参数,则optarg指向选项参数字符串;若该选项不带选项参数,则optarg为NULL;若该选项的选项参数为可选时,optarg为NULL表明无选项参数,optarg不为NULL时则指向选项参数字符串。
    int optind -- 下一个待处理元素在argv中的索引值。即下一次调用getopt的时候,从optind存储的位置处开始扫描选项。当getopt()返回-1后,optind是argv中第一个Operands的索引值。optind的初始值为1。
    int opterr -- opterr的值非0时,在getopt()遇到无法识别的选项,或者某个选项丢失选项参数的时候,getopt()会打印错误信息到标准错误输出。opterr值为0时,则不打印错误信息。
    int optopt -- 在上述两种错误之一发生时,一般情况下getopt()会返回’?',并且将optopt赋值为发生错误的选项。
    getopt()扫描模式
    getopt()的默认模式扫描模式是这样的:getopt()从左到右按顺序扫描argv[1]到argv[argc-1],注意这就说了他不从程序文件名argv[0]扫描并将选项Option和选项参数Option argument按它们在命令行上出现的次序放到argv数组的左边,而那些Operands则按它们出现的次序放在argv的后边。也就是说,getopt()在默认扫描模式下,会重新排序argv数组。

以为例子getopt(argc, argv, “ab:c🇩🇪:”);
选项a,d是不需要选项参数的,选项b,c需要选项参数,而选项e的选项参数是可选的,即如果提供选项e的选项参数的话,那么选项参数必须紧跟选项e之后,不能以空格隔开。
扫描过程中,要时刻铭记optind是下一个待处理元素在argv中的索引,当遇到Operands的时候则跳过,optind数值增加跳过的Operands个数。好,现在我们根据这些规则,详细分析下刚刚程序的扫描过程:
./getopt1 operand1 -a operand2 -b barg operand3 -c carg operand4 -d operand5 operand6 -e operand7
第一行:即getopt()扫描重排序之前,optind的值默认被初始化为1。
第二行:getopt()首先从operand1开始扫描,发现operand1是Operands,则跳过,optind增加1等于2指向-a,继续扫描。扫描到-a时发现是有效选项,则optind增加1等于3指向operand2,然后返回选项a。

第三行:在继续扫描前,getopt()重新排序argv数组,将“-a”和“operand1”的位置互换。继续扫描,发现operand2是Operands,跳过,optind增加1等于4指向-b,继续扫描。发现-b是有效选项,因为选项b需要参数,因此把barg的首地址赋给optarg,optind增加2等于6指向operand3,返回选项b。
第四行:在继续扫描前,getopt()重新排序argv数组,将“-b barg”和“operand1 operand2”的位置互换。继续扫描,发现operand3是Operands,跳过,optind增加1等于7指向-c,继续扫描。扫描到-c是发现是有效的选项,因为选项c跟选项b一样,都需要参数,因此处理过程是一样的,把carg的首地址赋给optarg,optind增加2等于9指向operand4,返回选项c。
第五行:在继续扫描前,getopt()重新排序argv数组,将“-c carg”和“operand1 operand2 operand3”的位置互换。继续扫描,发现operand4是Operands,跳过,optind增加1等于10指向-d,继续扫描。扫描到-d时发现是有效选项,因为选项d不需要参数,因此直接optind增加1等于11指向operand5,返回选项d。
第六行:在继续扫描前,getopt()重新排序argv数组,将“-d”和“operand1 operand2 operand3 operand4”的位置互换。继续扫描,发现operand5是Operands,跳过,optind增加1等于12指向operand6,继续扫描。扫描到operand6时发现依然是Operands,跳过,optind增加1等于13指向-e,继续扫描。扫描到-e时发现是有效选项,因为后面的operand7与-e之间有间隔,因此这里选项e没有参数。optind增加1等于14指向operand7,返回选项e。
第七行:在继续扫描前,getopt()重新排序argv数组,将“-e”和“operand1 operand2 operand3 operand4 operand5 operand6”的位置互换。继续扫描,发现operand7是Operands,跳过,optind增加1等于15指向argv[argc],即NULL。至此扫描完毕,getopt()重新设置optind为8,是其指向第一个Operands,即operand1,最后返回-1停止扫描。
argv 排序是 /getopt1 - a -b barg -c carg -d -e operand1 operand2 operand3 operand4 operand5 operand6 operand7
命令行中每个用空格空开的就算argc+1 存在argv中
参考此链接
学习使用侵权立刻删除!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cesiumlab中shp转3dtiles白模效果一

安装cesiumlab 如果没有安装cesiumlab,去官网下载安装一个即可 http://www.cesiumlab.com/cesiumlab.html 效果 步骤 1、准备shp面数据 2、打开cesiumlab软件转换 选择shp面数据 设置高度,如果shp面中有高度字段,可以用高度字段&#xff…

高铁列车员信息宣传向媒体投稿有哪些方法?

作为一名高铁列车工作人员,我肩负着传递高铁精神、展示列车员风采的重要使命。每月,我都要完成单位对外信息宣传的考核任务,通过媒体投稿来发表列车员的信息宣传文章。在这条信息宣传之路上,我经历了从摸着石头过河到智慧投稿的蜕变,其中的心酸与轻松交织,成为了我职业生涯中难…

云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践

导语 随着云计算技术的日益成熟,云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下,高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生,凭借其深厚的技术功底和丰富的实战经验,为我们带…

基于C++的一种字符串切分方法及示例代码

一、概述 在 Java 和 python 中,都有实现字符串切分的方法, 如split() ,使用起来较为方便,但是在标准的 C 中,却没有内置的 split() 方法。 我们可以使用标准库中的一些函数和方法来实现字符串的切分,这里…

【报错 - npm包问题】 token.type.endsWith is not a function

将 babel-eslint 10.1.0版本,降为 8.2.2 npm install babel-eslint8.2.2 --save

[云原生] Prometheus理论知识及系统搭建

promethues是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还…

逻辑斯特 + 神经网络梯度下降公式推导 + 向量化

全部推导来自吴恩达老师的视频课,下面仅作整理 逻辑斯特 神经网络

手写超级好用的rabbitmq-spring-boot-start启动器

手写超级好用的rabbitmq-spring-boot-start启动器 文章目录 1.前言2.工程目录结构3.主要实现原理3.1spring.factories配置3.2EnableZlfRabbitMq配置3.3RabbitAutoConfiguration配置3.4ZlfRabbitMqRegistrar配置 4.总结 1.前言 由于springBoot官方提供的默认的rabbitMq自动装配不…

insertAdjacentHTML() 作用

insertAdjacentHTML()简介 insertAdjacentHTML() 方法是将文本解析为 element 元素,并将结果节点插入到DOM树中的指定位置。它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤,使其比直接使用innerH…

机试:数塔路径

问题描述: 代码示例: //数塔路径 #include <bits/stdc.h>using namespace std;int main(){ // 算法思想: // 逆推,将最下方和右下方的数字进行比较,哪个大则加上并更新,直至到根节点即为最大 int n;cin >> n; int nums[n1][n1]; // 输入数塔 for(int i 1;i < n…

搭建Hadoop3.x完全分布式集群

零、资源准备 虚拟机相关&#xff1a; VMware workstation 16&#xff1a;虚拟机 > vmware_177981.zipCentOS Stream 9&#xff1a;虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso Hadoop相关 jdk1.8&#xff1a;JDK > jdk-8u261-linux-x64.tar.gzHadoop 3.3.6&am…

逆变器功率软起斜率要求

安规说明 在NB32004中&#xff0c;有明确要求&#xff0c;有功功率调整速率不得超过正负10%Pn/min&#xff0c;包括起停机。 控制对象 控制功率最终是通过调整D轴电流给定来达到限制功率的目的&#xff0c;所以我们只要让D轴的电流给定限幅值按照10%/min增加就好了。 具体实…

Selenium Web自动化测试——基于unittest框架的PO设计模式

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

一文讲懂 C++ 类和对象(1)

0. 面向过程程序设计和面向对象程序设计的区别 面向对象程序设计往往关注的是怎么去做&#xff0c;是将解决问题的步骤分析出来&#xff0c;然后用函数把步骤一步一步实现&#xff0c;然后再依次调用就可以了。而面向对象是将构成问题的事物&#xff0c;分解成若干个对象&…

比特币创造历史新纪录

综合来源&#xff1a;coindesk and cointelegraph 编译&#xff1a;秦晋 3月11日&#xff0c;比特币在亚洲交易时段首次突破71,000美元&#xff0c;这个是比特币创造的价格新纪录。自1月11日比特币现货ETF在美国获批以来&#xff0c;比特币一直在稳步上涨。以太币突破4000美元。…

rust学习(手动写一个线程池)

哈哈&#xff0c;主要是为了练习一下rust的语法&#xff0c;不喜勿喷。 一.Executor申明 struct AExecutor<T> {results:Arc<Mutex<HashMap<u32,T>>>, //1functions:Arc<Mutex<Vec<ATask<T>>>> //2 } 1.results&#xff1a…

产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)

目 录 一、测试目的&#xff1a; 二、测试方案&#xff1a; 2.1、测试思路 2.2、拓扑图 三、测试环境 3.1 服务器配置 3.2 网络摄像机列表 3.3 测试软件 四、测试流程 4.1 H.264并发测试&#xff1a; 4.1.1老版本srsout3.10并发测试 4.1.2 新版本srsout…

2024年信息技术与计算机工程国际学术会议(ICITCEI 2024)

2024年信息技术与计算机工程国际学术会议&#xff08;ICITCEI 2024&#xff09; 2024 International Conference on Information Technology and Computer Engineering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 大会主题&#xff1a; 信息系统和技术…

如何选择腾讯云轻量应用服务器地域?北京上海广州哪个合适?

腾讯云轻量应用服务器地域如何选择&#xff1f;地域就近选择&#xff0c;北方选北京地域、南方选广州地域&#xff0c;华东地区选上海地域。广州上海北京地域有什么区别&#xff1f;哪个好&#xff1f;区别就是城市地理位置不同&#xff0c;其他的差不多&#xff0c;不区分好坏…

基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大&#xff0c;容错率低&…