C语言中命令行工具 (getopt和getopt_long)

C语言处理参数的 getopt() 函数 getopt() 函数用于解析命令行参数。它的 argc 和 argv 参数通常直接从 main() 的参数直接传递而来。optstring 是可以处理选项字母组成的字符串。该字串里的每个字符对应于一个以 ‘-’ 开头的选项。如果该字串里的任一字符后面有冒号,那么这个选项就要求有参数(如“hd:”对应于 '-h' 和 '-d', 其中 '-d' 后需接参数)。而如果选项后面接两个冒号,则说明这个选项后的参数是可选的,即可带参数也可不带参数。 阅读详情

#include <iostream>
#include <unistd.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

/* @getopt的全局变量
** 1. char* optarg:正在解析的选项的参数
** 2. int optind:指向下一个选项的索引
** 3. int opterr:非0时会将错误信息打印在stdout上
** 4. int optopt:若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符?,同时将optopt设为该选项
*/
extern char *optarg;
extern int optind, opterr, optopt;

void test01(int argc, char *argv[])
{
    /* @param
    ** 参数选项有  -a -b -c -d
    ** 其中-a  -b后面不带“:”  所以这两个选项不可以有参数,即使有参数他也不会去识别
    ** -c 后面有一个“:”  所以这个选项后面必须有参数,参数有两种形式  1. 参数紧贴选择项 -b100 ;  2. 参数跟选项使用空格分隔  -b 100
    ** -d 后面有两个“:”  所以这个选项后面的参数可有可无,当有参数的时候  参数必须紧贴选项
    */
    int opt = -1;
    while (opt = getopt(argc, argv, "abc:d::") != -1)
    {
        cout << "opt: " << opt << endl;

        cout << "optarg:" << optarg << endl;
        cout << "optopt:" << optopt << endl;
        cout << "optind:" << optind << endl;
    }

    cout << "opterr:" << opterr << endl;
}

/*
** getopt()允许我们设置optstring的首字符为冒号":",在这种情况下,
** 当发生无法识别的选项错误时getopt()返回字符"?",当发生丢失选项参数错误时返回字符":"。
** 这样我们就可以很轻松地分辨出错误类型了,
** 不过getopt()不会再打印错误信息了,一切事物都由我们自己来处理了。
*/

void test02(int argc, char *argv[])
{
    int verbose = 0; // 一个输出的判断条件
    int n = 0;       // 用于计数
    char opt;        // 用于存getopt函数的返回值

    // 一直循环解析  直到解析完毕
    while ((opt = getopt(argc, argv, "vn:")) != -1)
    {
        switch (opt)
        {
        case 'v':
            verbose = 1; // 将输出条件判断置为1
            break;
        case 'n':
            n = atoi(optarg); // 将选项-n的参数字符串转为整数
            cout << "n : " << n << endl;
            break;
        default:
            fprintf(stderr, "usage: error");
            exit(-1); // 异常退出程序
        }
    }
    int i = 0;
    for (i = 0; i < n; ++i)
    {
        if (verbose)
            cout << i << endl;
    }
    cout << "Done counting to " << n << endl;
}

int main1(int argc, char *argv[])
{
    if (argc < 2)
        return -1;
    test02(argc, argv);

    return 0;
}

/* ---------------------------------------------------------  */
/*
** int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
** 与getopt类似  但是getopt_long可接收长选项,长选项以“--”开头
** 如果程序只接受长选项,必须将optstring设置为空字符串“”
** 长选项可以采用两种形式:--arg=param或--arg param
** longopts是一个指针指向结构体option数组
*/
/* option结构体
** struct option {
**   const char *name;      // 长选项的名字
**   int         has_arg;   // 0不需要参数,1需要参数,2参数可选
**   int        *flag;      // 指定长选项的返回结果类型:flag=NULL时getopt_long返回val(可以将val设置为等效的短选项字符),flag!=NULL时getopt_long返回0
**   int         val;       // 要返回的值
** };
*/

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;
        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}, // optional_argument  参数可选
            {0, 0, 0, 0}
            /* 注意:option结构数组的最后一个元素必须用0填充 */
        };

        c = getopt_long(argc, argv, "abc:d:012", long_options, &option_index);
        if (c == -1)
            break;

        switch (c)
        {
        case 0:

            if (strcmp(long_options[option_index].name, "add") == 0)
                fprintf(stdout, "long option \"add\" value: %s\n", optarg);
            else if (strcmp(long_options[option_index].name, "append") == 0)
                fprintf(stdout, "long option \"append\"\n");
            else if (strcmp(long_options[option_index].name, "delete") == 0)
                fprintf(stdout, "long option \"delete\" value: %s\n", optarg);
            else if (strcmp(long_options[option_index].name, "create") == 0)
                fprintf(stdout, "long option \"create\" value: %s\n", optarg);
            else if (strcmp(long_options[option_index].name, "verbose") == 0)
                fprintf(stdout, "long option \"verbose\"\n");
            else if (strcmp(long_options[option_index].name, "file") == 0)
                fprintf(stdout, "long option \"file\" value: %s\n", optarg);
            break;
        case '0':
        case '1':
        case '2':
            if (digit_optind != 0 && digit_optind != this_option_optind)
                fprintf(stdout, "digits occur in two different argv elements.\n");
            digit_optind = this_option_optind;
            fprintf(stdout, "option %c\n", c);
            break;
        case 'a':
            fprintf(stdout, "option a\n");
            break;
        case 'b':
            fprintf(stdout, "option b\n");
            break;
        case 'c':
            fprintf(stdout, "option c with value '%s'\n", optarg);
            break;
        case 'd':
            fprintf(stdout, "option d with value '%s'\n", optarg);
            break;
        case '?':
            break;
        default:
            fprintf(stdout, "?? getopt returned character code 0%o ??\n", c);
        }
    }

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

C语言命令行参数解析:从argc/argv基础到getopt_long实战 命令行参数是程序与操作系统交互的基础接口,它允许用户在执行程序时动态传递配置和数据。其核心原理是通过main函数的argc和argv参数接收并解析用户输入,argc记录参数数量,argv存储参数字符串数组。这一机制的技术价值在于实现了程序的灵活性和可配置性,是构建命令行工具、脚本和系统服务的基石。在实际应用场景中,从简单的文件操作到复杂的编译工具链,都依赖命令行参数进行功能定制。本文聚焦于C语言中的参数处理,详细解析argc与argv的内存布局与访问方式,并深入探讨如何使用getopt和getopt_lon 阅读详情

相关推荐

getopt()与getopt_long()的使用简介

感性认识 getopt()与getopt_long()是专门处理命令行参数的两个函数,getopt()处理短参数,getopt_long()处理长参数。还不明白请看下面这张图: 解析 -t yiqi 就是这两个函数做的事,下面我们一起来看看究竟如何使用好这两个函数。还不明白的请看下图: 非常清楚,命令行参数由Command name,Option,Option argument以及Operands组成。 Command name不用多说,就是程序的名称。 操作对象Operands又称no.

我想月薪过万的博客 5000

命令行选项解析函数(C语言):getopt()和getopt_long()

getopt函数使用

jeek_we的博客 1011

getopt, getopt_long, getopt_long_only

命令行参数可以分为两类,一类是短选项,一类是长选项,短选项在参数前加一杠"-",长选项在参数前连续加两杠"--"。如:-a,-A,-b都表示短选项;--all,--almost-all,--author都表示长选项。getopt_long_only类似于getopt_long,但是'-'和"--"都可以表示长选项。如果以'-'(不是"--")开头的选项不匹配长选项,但匹配短选项,则将其解析为短选项。getopt_long函数的工作原理与getopt类似,只是它也接受以两个短划线开头的长选项。

数字人生 558

busybox 中 getopt32用法

1. 函数原型 uint32_t getopt32(char **argv, const char *applet_opts, ...) 函数的声明位于libbb.h 中,定义在libbb/getopt32.c 中。 命令行选项是通过字符串applet_opts 传递。 如果其中一个选项被找到了, 就有一个标志值(unsigned long类型)添加到返回值中。 2. 返回值 ...

私房菜 3219

C 语言命令行参数全指南:argc/argv 与 getopt 实战

本文介绍了C语言中命令行参数的处理方法。主要内容包括:1. 命令行参数的基本概念,通过main函数的argc和argv参数接收参数;2. 参数访问方法,包括遍历参数、类型转换和参数数量检查;3. 常见参数形式,如位置参数、选项参数和带参数值的选项;4. 使用getopt和getopt_long函数解析复杂参数;5. 综合应用示例展示文本文件处理器的实现;6. 常见错误与注意事项,强调参数检查、类型转换和内存管理的重要性。掌握命令行参数处理能增强程序的灵活性和交互性,是开发实用工具的关键技能。

2503_91057718的博客 1483

深度学习之常用算子介绍

打开 onnx 模型图,可以看到它是一个有向无环图。除了 Input、Output ,其他都是算子(是操作,而不是节点)在ONNX(Open Neural Network Exchange)模型中,除了输入和输出,其他都是算子(Operations)。算子是表示神经网络模型中的不同操作或层的元素。一个ONNX模型由一系列算子组成,通过连接这些算子来定义模型的计算流程。

ueke1的博客 8460

C 中 getopt_long()用法

在C程序中,getopt_long()支持长选项的命令行解析,是C程序在命令场景下的必须掌握函数之一. 函数原型如下:#include <getopt.h>int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *l

博客已搬家,请访问新博客https://kswapd.cn,提供更好的阅读体验。 1470

CTransformers: 高效的Python语言模型绑定库

CTransformers是一个为C/C++实现的Transformer模型提供Python绑定的开源库。它基于GGML库构建,旨在为开发者提供一种高效且易用的方式来在Python中使用各种流行的语言模型。支持多种流行的语言模型,如GPT-2、LLaMA、Falcon等提供统一的简单API接口支持GPU加速(CUDA和Metal)与Hugging Face Transformers和LangChain集成支持流式输出和嵌入计算。

helloaiworld的博客 1268

C语言库函数---getopt、getopt_long

/* getopt 练习 写一个函数,接受五个参数, 分别为:姓名、性别、年龄、身高、爱好 最后将这些信息打印出来,参数适用结构传递 */ #include <stdio.h> #include <unistd.h> typedef struct info{ char *name; char *sex; int age; int tall...

qq_23929673的博客 411

如何配置 OpenClaw 使用免费搜索工具:摆脱付费 API 限制

本文介绍了如何配置OpenClaw使用免费搜索工具来替代付费API。主要内容包括:1)启用内置的web_fetch工具直接获取网页内容;2)创建自定义脚本聚合免费AI资讯源;3)配置其他免费网络工具。文章详细说明了配置步骤,推荐了多个优质免费AI资讯网站,并分析了该方案的优劣势。这种配置方式完全免费且灵活,特别适合预算有限的用户,能够在不依赖付费API的情况下获取所需信息。

dongdeaiziji的专栏 9816

导带、价带

价带是电子的“束缚态”能量区间,决定材料的化学性质;导带是电子的“自由态”能量区间,直接决定材料的导电能力;禁带宽度则是区分金属、半导体与绝缘体的核心参数。通过调控能带结构(如掺杂、应变工程),可设计出具有特定电学和光学特性的功能材料,推动电子信息、能源转换等领域的技术革新。

weixin_51552564的博客 5117

程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例

该函数用来解析命令行参数。 前两个参数设为main函数的两个参数。 此函数的返回值即为当前找到的命令选项,全部选项都找到时的返回值为-1。通常一个命令有多个选项,为了取得所有选项,需要循环调用此函数,直到返回值为-1。 要使用此函数,还有几个全局变量必须要了解: 1.2. 实例 2. getopt_long 这是支持长命令选项的函数,长选项以’–'开头。 前三个参数与函数getopt的参数是一样的。 只支持长选项时,参数optstring设置为NULL或者空字符串""。 第四个参数是一个构造体struct

dbkernel 的博客 2147

为什么AI时代的优秀组织,都在学习Meta的Pod结构?看完秒懂

当AI技术重塑产业格局,企业协作正面临前所未有的挑战——层级繁琐、跨部门内耗、迭代滞后,传统组织模式早已难以跟上技术革新的步伐。作为全球AI原生企业的标杆,Meta独创的Pod组织模式,用“小而美”的自治单元打破困局,成为AI时代高效协作的典范。本文将从定义、运作、价值到未来演进,全面拆解Pod模式,为企业组织变革提供可参考的思路与路径。德鲁克曾说:“组织的功能就是让平凡的人做平凡的事。”而Meta Pod打破这一局限,通过去中心化、指标导向、跨界融合,让优秀人才产生“化学反应”。

Kiss_AIHR的博客 1178

别再自己写参数解析了!C语言getopt和getopt_long保姆级教程(附完整代码)

本文详细介绍了C语言中getopt和getopt_long的使用方法,帮助开发者高效解析命令行参数。通过对比手动解析的弊端,展示了标准库的简洁性和强大功能,包括错误处理、长选项支持及实战模板,提升CLI工具的开发效率。

weixin_30437847的博客 258

视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)

内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li

大模型大数据攻城狮的专栏 2204

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)

vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu

✅ 精选推荐文章 5703

Reference

C 语言命令 解析命令行参数–getopt和getopt_long SPDK

yaoxinJJJ的博客 232

btstack ble ota开发笔记(2)-mcuboot移植

紧接上一篇文章,要实现一个完整的ota demo,除了实现ota image的传输通道外,还需要“bootloader”这个角色来帮我们实现ota image的校验、安全、引导以及启动,这里我选择开源的组件mcuboot,下面开始介绍mcuboot在stm32f4-discovery上的移植。首先估算下bootloader & application image的大小,确定好flash的分布情况,因为后续会涉及到flash的操作(读、写、擦除),为了方便程序的编写,各个image area在flash中的起

weixin_38177846的博客 2350

getopt 和 getopt_long 命令行解析函数

getopt 和 getopt_long 命令行解析函数

hinewcc的博客 4007

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WebBench测试源码解析

Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。 下载链接:https://github.com/LippiOuYang/WebBenchlWebBench.c是主要的实现文

energysober的博客 498

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

getopt.h和getopt(),getopt_long()等函数

下载了一个牛人的代码,里面包括了一个getopt.h的头文件,在vs2008下无法通过编译,没有这个头文件,上网搜索了一些信息,记录下来,以方便以后查阅。      getopt.h和对应的链接库不是每个编译器都有的,gcc编译器好像是有的,但是在vs2008是没有的,所以就要去网上下载跨平台的代码,不管怎么样,最终要把getopt.h和相应的lib文件和工程链接起来,这样才不会报错。这些都比较

涛行无疆的专栏 1万+

getopt、getopt_long和getopt_long_only的用法

引子 前段时间博主曾写过一个Linux下的小项目叫myls,也就是实现了ls的基本功能。myls的命令行参数解析是由博主自己编码完成的,这可把博主给坑惨了!博主不久前查资料的时候看到了getopt、getopt_long和getopt_long_only这三个函数,发现这三个函数堪称命令行参数解析的“神器”!早知道有这样的工具,博主也不至于被命令行参数解析所困扰了。这么好的东西当然要分享给大家啦!所以博主写了这篇博客,也欢迎大佬指教! 用途 getopt、getopt_long和getopt_long_on

VincilLau的博客 882

C语言中的getopt()和getopt_long()函数

getopt被用来解析命令行选项参数。 getopt_long支持长选项的命令行解析. 例如我们通常在终端上输入如下命令: ./main -l yongyuan --name  aini或者 /main -l yongyuan --name=aini 前面的./main表示执行main程序而后面的l就是参数,后面空格之后的yongyuan是参数值。 而与后面不同的是--name前面有两个

Stephan14的专栏 1748

c语言getopt long,使用getopt_long()从命令行获取参数

众所周知,C程序的主函数有两个参数,其中,第一个参数是整型,可以获得包括程序名字的参数个数,第二个参数是字符数组指针或字符指针的指针,可以按顺序获得命令行上各个字符串参数。其原形是:int main(int argc, char *argv[]);或者int main(int argc, char **argv);如果有一个解析CDR的程序,名叫destroy,负责将一个二进制格式的CDR文件转换...

weixin_31321361的博客 675

C语言:命令行选项解析函数---getopt()和getopt_long()

上午在看源码项目 webbench 时,刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了,说实话这函数没怎么见过,自然不知道这哥们是干什么的。于是乎百度了一番,原来是处理命令行选项参数的,的确,正规点的大型程序一般第一步就是处理命令行参数的,接着才是主干程序。在百度和 man 的帮助下,找到了具体使用方法和解释,二话不说赶紧学习一下,并总结出文档记录一下。 平时在写程序时常常需要...

houxiaoni01的博客 1325
上一篇: Nginx学习(10)—— event模块、core模块、变量
下一篇: Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)
丶星下灯
博客等级 码龄6年 125粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值