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

2024-02-03 13:08
文章标签 语言 函数 long getopt

本文主要是介绍C语言中的getopt()和getopt_long()函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

getopt被用来解析命令行选项参数。
getopt_long支持长选项的命令行解析.
例如我们通常在终端上输入如下命令:
./main -l yongyuan --name  aini或者 /main -l yongyuan --name=aini
前面的./main表示执行main程序而后面的l就是参数,后面空格之后的yongyuan是参数值。
而与后面不同的是--name前面有两个-,这就说明name是一个长选项参数,后面可以跟一个空格或者等号接着在跟一个参数值。
下面我们来讨论命令行选项参数,这个时候仅使用getopt()函数就可以达到要求。
文件  #include<getopt.h>
函数原型 int getopt(int argc,char * const argv[],const char * optstring);
其中argc和argv是来自主函数的参数,argc是命令行总的参数个数  ,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面 跟的用户输入的参数。
optsting是选项参数组成的字符串:
1.单个字符,表示选项,
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3 单个字符后跟两个冒号,表示该选项后可以有参数也可以没有参数。如果有参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
optstring是一个字符串,表示可以接受的参数。例如,"a:b:cd",表示可以接受的参数是a,b,c,d,其中,a和b参数后面跟有更多的参数值。(例如:-a host -b name)

optarg——指向当前选项参数(如果有)的指针。 optind——再次调用 getopt() 时的下一个 argv 指针的索引。 optopt——最后一个未知选项。

运行如下代码:

  1. #include <unistd.h>  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     int opt;  
  8.     char *optstring = "a:b:c:d";  
  9.   
  10.     while ((opt = getopt(argc, argv, optstring)) != -1)  
  11.     {  
  12.         printf("opt = %c\n", opt);  
  13.         printf("optarg = %s\n", optarg);  
  14.         printf("optind = %d\n", optind);  
  15.         printf("argv[optind - 1] = %s\n\n",  argv[optind - 1]);  
  16.     }  
  17.   
  18.     return 0;  
  19. }  
运行结果如下:

md101deMacBook-Pro:~ md101$ ./main -d -c qq

opt = d

optarg = (null)

optind = 2

argv[optind - 1] = -d


opt = c

optarg = qq

optind = 4

argv[optind - 1] = qq

上面这个optstring在传入之后,getopt函数将依次检查命令行是否指定了 -a, -b, -c及 -d(这需要多次调用getopt函数,直到其返回-1),当检查到上面某一个参数被指定时,函数会返回 被指定的参数名称(即该字母)

下面介绍长选项的命令行解析,这时使用getopt_opt()函数

文件  #include<getopt.h>

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

其中的前三个参数与getopt()函数相同,第四个参数longopts指向的是一个由option结构体组成的数组,那个数组的每个元素,指明了一个“长参数”(即形 如--name的参数)名称和性 质,option结构体已经在C语言的option结构体介绍了,不明白的请到那里查看,至于第四个参数longindex表示当前长参数在 longopts中的索引值,如果longindex非空,它指向的变量将记 录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值。

运行如下代码:


  1. #include <unistd.h>  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  4. #include <getopt.h>  
  5.   
  6. int  
  7. main(int argc, char **argv)  
  8. {  
  9.    int opt;  
  10.    int digit_optind = 0;  
  11.    int option_index = 0;  
  12.    char *optstring = "a:b:c:d";  
  13.    static struct option long_options[] = {  
  14.        {"reqarg", required_argument, NULL, 'r'},  
  15.        {"noarg",  no_argument,       NULL, 'n'},  
  16.        {"optarg", optional_argument, NULL, 'o'},  
  17.        {0, 0, 0, 0}  
  18.    };  
  19.   
  20.    while ( (opt = getopt_long(argc, argv, optstring, long_options, &option_index)) != -1)  
  21.    {  
  22.         printf("opt = %c\n", opt);  
  23.         printf("optarg = %s\n", optarg);  
  24.         printf("optind = %d\n", optind);  
  25.         printf("argv[optind - 1] = %s\n",  argv[optind - 1]);  
  26.         printf("option_index = %d\n", option_index);  
  27.    }  
  28.   
  29.    return 0;  
  30. }  

运行结果为:

md101deMacBook-Pro:~ md101$ gcc -o main main.c

md101deMacBook-Pro:~ md101$ ./main -a you --reqarg you --noarg

opt = a

optarg = you

optind = 3

argv[optind - 1] = you

option_index = 0

opt = r

optarg = you

optind = 5

argv[optind - 1] = you

option_index = 0

opt = n

optarg = (null)

optind = 6

argv[optind - 1] = --noarg

option_index = 1

运行的过程中,getopt_long()函数将依次检查命令行是否指定了 -a, -b, -cd,--reqarg,--noarg,--optarg(这需要多次调用getopt函数,直到其返回-1),当检查到上面某一个参 数被指定时,函数会返回被指定的参数名称。

当所给的参数存在问题时,opt(即函数返回值是'?'),如

md101deMacBook-Pro:~ md101$ ./main --rea

main: unrecognized option `--rea'

opt = ?

optarg = (null)

optind = 2

argv[optind - 1] = --rea

option_index = 0








这篇关于C语言中的getopt()和getopt_long()函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674244

相关文章

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高