首页 > 其他分享 >getopt函数/getopt_long函数

getopt函数/getopt_long函数

时间:2024-03-19 19:12:05浏览次数:22  
标签:选项 函数 int arg long printf getopt

getopt函数/getopt_long函数

目录

getopt

getopt 函数是 Unix 和 Linux 系统编程中用于解析命令行选项的常用工具。它属于 GNU C 库的一部分,因此在大多数 Linux 发行版中都是可用的。下面是一个简单的 getopt 函数的使用示例:

#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  
  
int main(int argc, char *argv[]) {  
    int opt;  
    int aflag = 0;  
    int bflag = 0;  
    char *cvalue = NULL;  
  
    while ((opt = getopt(argc, argv, "abc:")) != -1) {  
        switch (opt) {  
        case 'a':  
            aflag = 1;  
            break;  
        case 'b':  
            bflag = 1;  
            break;  
        case 'c':  
            cvalue = optarg;  
            break;  
        case '?':  
            if (optopt == 'c')  
                fprintf(stderr, "Option -%c requires an argument.\n", optopt);  
            else if (isprint(optopt))  
                fprintf(stderr, "Unknown option `-%c'.\n", optopt);  
            else  
                fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt);  
            return 1;  
        default:  
            abort();  
        }  
    }  
  
    /* 检查是否还有额外的非选项参数 */  
    if (optind < argc) {  
        printf("non-option ARGV-elements: ");  
        while (optind < argc)  
            printf("%s ", argv[optind++]);  
        printf("\n");  
    }  
  
    printf("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue);  
  
    return 0;  
}

这个示例程序使用 getopt 函数解析命令行选项 -a-b-c,其中 -c 选项需要一个参数。程序首先通过 getopt 循环解析所有的命令行选项,然后根据解析结果设置相应的标志或变量。如果解析过程中遇到未知的选项或 -c 选项缺少参数,程序会打印错误信息并退出。最后,程序打印出解析得到的选项值,并检查是否有额外的非选项参数。

你可以像这样编译和运行这个程序:

gcc -o getopt_example getopt_example.c  
./getopt_example -a -b -c value1 arg1 arg2

这将输出:

aflag = 1, bflag = 1, cvalue = value1  
non-option ARGV-elements: arg1 arg2

getopt_long

getopt_long 函数是 getopt 函数的扩展,它允许你使用长选项(例如 --option 而不是 -o),并且支持选项的参数。下面是一个使用 getopt_long 的简单示例:

#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <getopt.h>  
  
static struct option long_options[] = {  
    {"verbose", no_argument,       0, 'v'},  
    {"create",  required_argument, 0, 'c'},  
    {"file",    required_argument, 0, 'f'},  
    {"help",    no_argument,       0, 'h'},  
    {0, 0, 0, 0}  
};  
  
int main(int argc, char *argv[]) {  
    int option_index = 0;  
    int c;  
    char *create_arg = NULL;  
    char *file_arg = NULL;  
    int verbose_flag = 0;  
  
    while ((c = getopt_long(argc, argv, "vc:f:h", long_options, &option_index)) != -1) {  
        switch (c) {  
            case 'v':  
                verbose_flag = 1;  
                break;  
            case 'c':  
                create_arg = optarg;  
                break;  
            case 'f':  
                file_arg = optarg;  
                break;  
            case 'h':  
                printf("Usage: %s [-v] [-c arg] [-f arg] [-h]\n", argv[0]);  
                exit(EXIT_SUCCESS);  
            default:  
                /* '?' 被 getopt_long 打印 */  
                exit(EXIT_FAILURE);  
        }  
    }  
  
    /* 检查是否还有额外的非选项参数 */  
    if (optind < argc) {  
        printf("Non-option arguments: ");  
        while (optind < argc)  
            printf("%s ", argv[optind++]);  
        printf("\n");  
    }  
  
    printf("Verbose flag is %s\n", verbose_flag ? "on" : "off");  
    if (create_arg)  
        printf("Create argument is '%s'\n", create_arg);  
    if (file_arg)  
        printf("File argument is '%s'\n", file_arg);  
  
    return 0;  
}

在这个示例中,我们定义了一个 long_options 结构体数组,它包含了所有支持的长选项和对应的短选项。getopt_long 函数会根据这个数组解析命令行参数。

你可以这样编译和运行这个程序:

gcc -o getopt_long_example getopt_long_example.c  
./getopt_long_example --create newfile --file input.txt -v

这将会输出:

Verbose flag is on  
Create argument is 'newfile'  
File argument is 'input.txt'

注意,getopt_long 函数在解析到未知选项时会打印一个错误消息,并且会设置 optopt 变量为未知选项的第一个字符。如果你想自定义错误消息或处理逻辑,可以在 switch 语句中添加一个 case '?': 分支。

此外,如果 getopt_long 检测到需要参数的选项没有跟随相应的参数,它也会打印一个错误消息,并将 optarg 设置为 NULL。在上面的示例中,我们通过检查 optarg 是否为 NULL 来确保所有需要参数的选项都已经正确提供了参数。

标签:选项,函数,int,arg,long,printf,getopt
From: https://www.cnblogs.com/adam-ma/p/18083716

相关文章

  • ftok函数
    ftok函数ftok函数在Unix和Linux系统中用于生成一个唯一的键(key),这个键通常用于IPC(进程间通信)机制,如消息队列、信号量或共享内存。它基于给定的文件路径和单个字符(通常是项目的唯一标识符)来生成这个键。ftok的名字来源于"filetokey"的缩写。函数原型#include<sys/ipc......
  • 定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱
    业内较为常见的高频短时ETL数据加工场景,即频率高时延短,一般费用大头均在函数调用次数上,推荐方案一般为攒批处理,高额的计算成本往往令用户感到头疼,函数计算推出定向减免方案,让ETL数据加工更简单、更自动化、容错能力更强。自2024年01月01日0时起,函数计算定向减免来自阿里云消息......
  • 走出大模型部署新手村!小明这样用魔搭+函数计算
    前文介绍了魔搭ModelScope社区模型服务SwingDeploy服务。开发者可以将模型从魔搭社区的模型库一键部署至阿里云函数计算,当选择模型并部署时,系统会选择对应的机器配置。按需使用可以在根据工作负载动态的减少资源,节约机器使用成本。5分钟完成从开源模型至模型推理API服务的......
  • C语言进阶篇之字符函数和字符串函数(含模拟实现库函数)
    本篇主要整理了C语言字符函数和字符串函数的介绍,使用,以及库函数的模拟,持续更新中。老铁们,整理不易,创作不易,先赞后看养成习惯,你的支持是对我更新最大的鼓励!函数介绍与模拟实现1.1strlen求字符串长度size_tstrlen(constchar*str);注:1.字符串已经'\0'作为结束标......
  • Excel新函数TEXTJOIN太强大了,这些高级用法太实用了
    今天跟大家分享WPS中新函数TEXTJOIN的使用方法和技巧,它不仅仅是一个强大的文本连接函数,还有一些高级用法可以帮助我们快速解决日常难题。TEXTJOIN函数介绍作用:TEXTJOIN函数是文本连接函数,使用分隔符连接列表或文本字符串区域。语法:=TEXTJOIN(分隔符,忽略空白单元格,字符串......
  • OpenCV4中的图像滤波函数定义,原理,以及区别(Python)
    图像滤波1.方框滤波方框滤波的滤波器为矩形,滤波器中的所有元素值均相等。定义如下:dst=boxFilter(src,ddepth,ksize,dst=None,anchor=None,normalize=None,borderType=None)src:输入图像。ddepth:处理后的目标图像的深度,若为-1,则深度与原始图像的深度相同。ks......
  • uniapp 云开发省钱之调整函数执行内存大小
    我这个5块钱一个月的服务空间配置:现在还只有少量的用户和自己测试之用,目前消耗的情况:云函数的使用量还是挺高的,目前还是正好能覆盖一个月的使用量,等用户量上来肯定是不行的,所以得想想办法压榨一下云函数使用量了。看了下云函数使用量的计费方式,发现云函数的使用消耗跟......
  • uniapp 云开发省钱之调整函数执行内存大小
    我这个5块钱一个月的服务空间配置: 现在还只有少量的用户和自己测试之用,目前消耗的情况: 云函数的使用量还是挺高的,目前还是正好能覆盖一个月的使用量,等用户量上来肯定是不行的,所以得想想办法压榨一下云函数使用量了。看了下云函数使用量的计费方式,发现云函数的使用消耗......
  • sql语句基础语法之 数据表的添加相关 ​字段相关操作 ​数据筛选相关操作 ​数据排序
    3月18日数据表的筛选数据,字段操作,聚合函数内容如下:​数据表的添加相关​字段相关操作​数据筛选相关操作​数据排序相关操作​聚合函数数据表的添加相关usemydb;createtableclass_img(`id`intuniquekeyauto_incrementcomment'序号',`grade`i......
  • python中`__call__`让类像函数一样被调用
    在训练一个网络过程中,有下面代码'''4.训练网络'''print('开始训练')forepochinrange(3):runing_loss=0.0fori,datainenumerate(trainloader,0):inputs,label=data#1.数据加载ifdevice=='gpu':......