【Linux 命令行参数解析函数getopt()】原理及直白理解

最近写代码恰好碰见getopt()这个函数,去网上找了很久,说实话,其他人写的有点看不懂,所以将我认为可以便于理解的地方描述一下:

int getopt(int argc, char * const argv[], const char *optstring);

首先理解这个函数的功能(不能保证大家都能理解)

  1. 获取命令行信息,并读取命令行中的选项;
    (命令行组成或许存在盲区,这是某位博主的这是他的博客)
    Option就是选项,Option argument是参数:
    在这里插入图片描述

  2. 每读取到一个选项,会返回一个int整型,这个整型不是选项位置,而是选项对应的ASCII码值

  3. 这个函数附带了一些全局变量,这些全局变量中的optarg会对应着解析到的某个选项对应的参数

其次我们需要理解函数原型

该函数的参数说明如下:

argc(参数个数):
  1. 类型:int
  2. 说明:这是从main函数传递过来的命令行参数个数。在C语言中,argc包含了程序名(即argv[0]),因此如果命令行中有3个参数(不包括程序名),则argc的值为4。
argv(参数内容):
  1. 类型:char * const argv[]
  2. 说明:这是从main函数传递过来的命令行参数数组。argv是一个指向指针的指针,每个指针指向一个C风格的字符串(以null字符\0结尾)。argv[0]通常是程序的名称,随后的元素是传递给程序的命令行参数。
optstring(选项字符串):
  1. 类型:const char *
  2. 说明:这是一个字符串,它定义了getopt函数可以识别的选项。选项字符串中的每个字符都代表一个有效的选项。如果某个选项字符后面跟着一个冒号(:),则表示该选项需要一个参数。如果字符后面跟着两个冒号(::),则表示该选项的参数是可选的。
getopt函数的返回值主要有以下几种情况:
  1. 选项字符:当成功解析一个选项时,getopt返回该选项的字符(实际上是其ASCII码值,但通常直接作为字符使用)。
  2. EOF或-1:当所有选项都解析完毕后,getopt返回EOF(在POSIX系统中,EOF通常定义为-1)。这表示没有更多的选项需要处理。
  3. ‘?’:如果遇到不符合optstring指定的选项,并且opterr未被设置为0,getopt会打印一个错误消息,并返回’?'字符。这通常用于表示未知的选项。

getopt函数的全局变量:

  1. optarg:指向当前选项参数的指针(如果有的话)。
  2. optind:再次调用getopt时的下一个argv指针的索引。
  3. opterr:如果设置为0,则getopt不会打印错误消息。
  4. optopt:最后一个未知选项。

getopt函数的行为:

  1. 当成功解析一个选项时,返回该选项的字符(实际上是其ASCII码值,但通常直接作为字符使用)。
  2. 当所有选项都解析完毕后,返回-1或EOF。
  3. 如果遇到不符合optstring指定的选项,getopt将显示一个错误消息(除非opterr被设置为0),并将optopt设为?字符。

getopt参数示例(这个案例很清晰,如果要做大总结,我觉得这个函数的名称其实就足够:命令行参数解析函数)

假设我们有以下optstring:“ab:c::de”,并考虑以下命令行参数:

./program -a -b argb --c=argc -d -e arge foo bar

在C程序中,我们可能会这样使用getopt:

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
  
int main(int argc, char *argv[]) {  
    int opt;  
    while ((opt = getopt(argc, argv, "ab:c::de")) != -1) {  
        switch (opt) {  
        case 'a':  
            printf("Option -a\n");  
            break;  
        case 'b':  
            printf("Option -b with argument '%s'\n", optarg);  
            break;  
        case 'c':  
            // 注意:如果选项c后面有参数,它必须紧跟在c后面  
            if (optarg) {  
                printf("Option -c with argument '%s'\n", optarg);  
            } else {  
                printf("Option -c (no argument)\n");  
            }  
            break;  
        case 'd':  
            printf("Option -d\n");  
            break;  
        case 'e':  
            // 注意:选项e后面的'arge'不是选项e的参数,而是非选项参数  
            printf("Option -e\n");  
            break;  
        case '?':  
            // getopt会打印错误消息,但我们也可以在这里添加自定义处理  
            fprintf(stderr, "Unknown option: %c\n", optopt);  
            exit(EXIT_FAILURE);  
        default:  
            abort(); // 其他情况下,应该不会发生  
        }  
    }  
  
    // optind现在是第一个非选项参数的索引  
    // 在这个例子中,它是"foo"的索引  
    for (int i = optind; i < argc; i++) {  
        printf("Non-option argument: %s\n", argv[i]);  
    }  
  
    return 0;  
}

运行上面的程序,输出将会是:

Option -a  
Option -b with argument 'argb'  
Option -c (no argument) // 因为-c后面没有直接跟随参数  
Option -d  
Option -e  
Non-option argument: foo  
Non-option argument: bar

注意,尽管命令行中包含–c=argc这样的长选项格式,但getopt只处理短选项(单个字符的选项)。如果你需要处理长选项,可能需要使用getopt_long函数或手动解析它们。

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

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

相关文章

军用光电耦合器产品的市场潜力与应用前景

光电耦合器作为现代军事技术中的关键组件&#xff0c;其在军用领域的市场空间和应用前景备受关注。本文将深入分析光电耦合器产品在军事领域中的市场潜力&#xff0c;探讨其技术特点、应用场景及未来发展趋势。 光电耦合器技术特点与工作原理 光电耦合器是一种能够将电信号与光…

HDC Cloud 2024 | CodeArts加速软件智能化开发,携手HarmonyOS重塑企业应用创新体验

2024年6月21~23日&#xff0c;华为开发者大会HDC 2024在东莞溪流背坡村隆重举行。期间华为云主办了以“CodeArts加速软件智能化开发&#xff0c;携手HarmonyOS重塑企业应用创新体验”为主题的分论坛。论坛汇聚了各行各业的专家学者、技术领袖和开发者&#xff0c;共同探讨Harmo…

解决Transformer根本缺陷,所有大模型都能获得巨大改进

即使最强大的 LLM 也难以通过 token 索引来关注句子等概念&#xff0c;现在有办法了。 最近两天&#xff0c;马斯克和 LeCun 的口水战妥妥成为大家的看点。这两位 AI 圈的名人你来我往&#xff0c;在推特&#xff08;现为 X&#xff09;上相互拆对方台。 LeCun 在宣传自家最新论…

VERYCLOUD睿鸿股份确认参展2024年ChinaJoy BTOB商务洽谈馆,期待与你相聚

作为在全球数字娱乐领域兼具知名度与影响力的年度盛会&#xff0c;2024年第二十一届ChinaJoy将于7月26日至7月29日在上海新国际博览中心盛大召开&#xff0c;本届展会主题为&#xff1a;初心“游”在&#xff0c;精彩无限&#xff01;&#xff08;Stay True, Game On.&#xff…

阿一网络安全培训中心专门为你准备了一份WScan使用教程

下载地址&#xff1a;https://github.com/chushuai/wscan/releases 版本的选择 Windows就选windows_amd64 Linux就选linux_amd64 mac就选darwin_amd64 下载好后&#xff0c;运行一次exe会生成一个config.yaml文件 把该文件中plugins下面的所有插件的enabled设置为True。&…

Java养老护理助浴陪诊小程序APP源码

&#x1f496;护理助浴陪诊小程序&#x1f496; 一、引言&#xff1a;养老新趋势&#x1f331; 在快节奏的现代生活中&#xff0c;养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务&#xff0c;让他们晚年生活更加安心、舒适&#xff0c;是我们每个人都需…

CentOS7环境下DataX的安装、使用及问题解决

DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 为了解决异构数据源同步问题&#xff0c;DataX将复杂的网状的同步链路变…

六、常用API ★ ✔

六、常用API 模块14.基础API第一章.String1.String介绍2.String的实现原理 ★3.String的创建 &#xff08;无参、字符串、字符数组、字节数组&#xff09;4.String 面试题【String s new String("abc")】5.字符串常见问题 第二章.String的方法1.判断方法&#xff08…

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等

简介 TypeScript 是 JavaScript 的超集&#xff0c;是 JavaScript&#xff08;弱类型语言&#xff09; 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中&#xff0c;社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而&#xff0c;随着技术的迅猛发展和用户需求的不断变化&#xff0c;Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界&#xff0c;分析数字社交的发展…

上海六十中学多功能气膜馆项目:轻空间全速推进

项目进展捷报频传 上海六十中学多功能气膜馆项目土建工作已基本完工&#xff0c;今天轻空间团队正式进场&#xff0c;展开气膜部分的施工。我们将为上海六十中学打造一个现代化、环保、高效的多功能气膜馆&#xff0c;提供优质的运动和活动场所。 现场施工一片繁忙 在施工现场&…

Windows部署MinIO,搭建本地对象存储服务

一、前言 二、MinIO介绍 三、Windows部署MinIO服务 1、准备工作 2、下载MinIO服务 3、启动MinIO服务 4、设置用户名密码 5、创建.bat文件启动服务 四、MinIO基本操作 1、存储桶管理 2、对象管理 3、数据查看 一、前言 基于外网的项目&#xff0c;可以使用阿里云等…

python数据分析与可视化二

公共部分 # 引入数据分析工具 Pandas import pandas as pd # 引入数据可视化工具 Matplotlib import matplotlib.pyplot as plt # 引入科学计算库numpy import numpy as np from scipy import stats #解决输出时列名对齐问题 pd.set_option(display.unicode.east_asian_wid…

【Redis-04 补充】Redis事务

【Redis-04 补充】Redis事务 1. 事务冲突的问题1.1 举例1.2 悲观锁1.3 乐观锁1.4 Redis中的乐观锁 WATCH key [key …]1.5 Redis事务三特性 2. 秒杀案例2.1 相关代码2.2 模拟并发工具httpd-tools 3. 设计一个秒杀系统3.1 预热库存3.2 秒杀请求3.3 生成订单3.4 限流与防刷 4. 总…

如何找合适的C++项目给自己的简历加分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; C的工作多种多样&#x…

[深度学习] 前馈神经网络

前馈神经网络&#xff08;Feedforward Neural Network, FFNN&#xff09;是人工神经网络中最基本的类型&#xff0c;也是许多复杂神经网络的基础。它包括一个输入层、一个或多个隐藏层和一个输出层。以下是详细介绍&#xff1a; 1. 结构 1. 输入层&#xff08;Input Layer&am…

入门网络安全工程师要学习哪些内容

大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。 网络安全工程师是一个概称&#xff0c;学习的东西很多&…

Flexsim物流仿真入门-利用网络节点控制行走路线

在布局优化过程中&#xff0c;往往叉车&#xff0c;操作人员的搬运&#xff0c;是会按照一定的行走路线进行的&#xff0c;这就需要我们进行节点的设计&#xff0c;以此来实现特定路径的行走。 在构建过程中&#xff0c;这里将会以案例的形式进行讲解说明。 1&#xff09;构建…

【Linux】进程间通信_3

文章目录 七、进程间通信1. 进程间通信分类命名管道 未完待续 七、进程间通信 1. 进程间通信分类 命名管道 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文件…

操作系统之《死锁与银行家算法》【知识点+详细解题过程】

知识点&#xff1a; 1、什么是死锁&#xff1f;&#xff08;别名"三角恋"&#xff0c;我喜欢你你喜欢他他喜欢我&#xff0c;明明都单身但是就是‘占有’不了&#xff09; 一组进程中&#xff0c;每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法…