详细解析命令行的getopt_long()函数

yizhihongxing

详细解析命令行的getopt_long()函数

什么是getopt_long()函数

getopt_long()函数是一个用于解析命令行参数的函数。它可以将命令行参数转换成易于处理的形式,便于程序进行后续的处理。getopt_long()函数基于POSIX标准,可以在UNIX/Linux操作系统及GNU系统中使用。

getopt_long()函数的用法

getopt_long()函数的原型如下:

#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

getopt_long()函数的参数说明如下:

  • argc:命令行参数个数
  • argv:命令行参数数组
  • optstring:指定短选项字符集合,用于告诉getopt_long()函数哪些字符代表选项
  • longopts:指向一个option结构体数组,用于指定长选项
  • longindex:用于保存当前处理到的长选项的下标

option结构体的定义如下:

struct option {
    const char *name;  // 长选项名称
    int         has_arg;  // 长选项是否带有参数,0表示不带,1表示必须带,2表示可选带
    int        *flag;  // 用于存储标记,指向一个变量,如果该变量值为0,函数返回值为name,否则返回0,并将flag指向的变量赋值为val
    int         val;   // 短选项字符集合中的每个字符或者一个非零值
};

getopt_long()函数的返回值

getopt_long()函数的返回值有以下几种情况:

  • 如果遇到无效选项或者选项参数缺失,返回?并将optopt设置为错误选项的ASCII码;
  • 如果遇到选项字符集合中的普通字符,返回该字符;
  • 如果遇到长选项,返回值为长选项的val字段;
  • 如果处理完所有选项,返回-1

getopt_long()函数的示例说明

示例1:短选项

#include <getopt.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int opt;
    while ((opt = getopt_long(argc, argv, "a:b:", NULL, NULL)) != -1) {
        switch (opt) {
            case 'a':
                printf("Option -a detected, argument=%s\n", optarg);
                break;
            case 'b':
                printf("Option -b detected, argument=%s\n", optarg);
                break;
            default:
                printf("Invalid option: %c\n", opt); 
                break;
        }
    }

    return 0;
}

在命令行中输入以下命令:

./test -a abc -b def

程序输出结果如下:

Option -a detected, argument=abc
Option -b detected, argument=def

这个示例演示了如何处理短选项。optstring参数指定了两个短选项ab,其中a选项是必须带参数的,而b选项是可选带参数的。getopt_long()函数会将短选项的指示符-从命令行参数中移除,从而将-a-b转换成字符aboptarg变量用于存储选项的参数。

示例2:长选项

#include <getopt.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    static struct option long_options[] = {
        {"file", required_argument, NULL, 'f'},
        {"debug", no_argument, NULL, 'd'},
        {"help", no_argument, NULL, 'h'},
        {0, 0, 0, 0}
    };

    int opt;
    while ((opt = getopt_long(argc, argv, "f:dh", long_options, NULL)) != -1) {
        switch (opt) {
            case 'f':
                printf("Option --file detected, argument=%s\n", optarg);
                break;
            case 'd':
                printf("Option --debug detected\n"); 
                break;
            case 'h':
                printf("Option --help detected\n"); 
                break;
            default:
                printf("Invalid option\n"); 
                break;
        }
    }

    return 0;
}

在命令行中输入以下命令:

./test --file abc.txt --debug

程序输出结果如下:

Option --file detected, argument=abc.txt
Option --debug detected

这个示例演示了如何处理长选项。long_options参数指定了三个长选项,其中file选项是必须带参数的,而debughelp选项都不带参数。长选项需要以--开头,并且选项名必须与long_options指向结构体数组中的name字段匹配。val字段指定短选项字符集合中的每个字符或一个非零值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详细解析命令行的getopt_long()函数 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Springboot AOP对指定敏感字段数据加密存储的实现

    下面是详细的攻略: 一、前置知识 在介绍 AOP 对指定敏感字段数据加密存储的实现前,需要对以下知识点有基本了解: SpringBoot 框架 SpringBoot AOP 相关概念 数据库加密存储方式 二、定义需求 我们需要实现一个 AOP 拦截器,拦截指定的敏感字段数据,进行加密处理后再存储到数据库中。 三、AOP 实现 1. Maven 依赖 我们需要…

    other 2023年6月26日
    00
  • 一个快速double转int的方法(利用magic number)

    下面是“一个快速double转int的方法(利用magic number)”的完整攻略,包括利用magic number的原理、具体实现方法和两个示例说明。 利用magic number的原理 在计算机中,double类型的数据占用8个字节,而int类型的数据占用4个字节。因此,将double类型的数据转换为int类型的数据时,需要将8个字节的数据压缩为4个…

    other 2023年5月5日
    00
  • BarTender如何创建文本对象?

    BarTender如何创建文本对象? BarTender是一款流行的标签和条码设计软件,可以用于创建各种类型的标签和打印物。下面是创建文本对象的完整攻略: 打开BarTender软件并创建一个新的标签设计。 在工具栏中选择“文本框”工具,或者使用快捷键T来创建一个文本框对象。 在标签设计区域点击鼠标左键并拖动,确定文本框的大小和位置。 双击文本框对象,进入编…

    other 2023年10月15日
    00
  • Android实现自定义圆形进度条

    下面是“Android实现自定义圆形进度条”的完整攻略。 1.准备工作 在开始实现自定义圆形进度条之前,我们需要进行一些准备工作: 添加依赖库 我们需要在项目的build.gradle文件中添加自定义View的依赖库。 dependencies { implementation ‘com.android.support:appcompat-v7:26.1.0…

    other 2023年6月25日
    00
  • iOS实现底部弹出PopupWindow效果 iOS改变背景透明效果

    iOS实现底部弹出PopupWindow效果 在iOS开发中,我们可以使用以下步骤实现底部弹出PopupWindow效果,并改变背景透明度。 步骤一:创建PopupWindow视图 首先,我们需要创建一个自定义的视图来实现PopupWindow效果。可以使用UIView或者UIWindow来创建视图,具体选择取决于你的需求。 示例代码: import UIK…

    other 2023年8月21日
    00
  • WPS Office Pro2016专业增强版详细安装激活教程(附序列号)

    WPS Office Pro2016专业增强版详细安装激活教程 WPS Office Pro2016专业增强版是一款功能强大的办公软件,在安装和激活过程中需要注意以下几个步骤。 步骤一:下载安装WPS Office Pro2016专业增强版 在官方网站(http://www.wps.cn/)上下载WPS Office Pro2016专业增强版安装包。下载完成…

    other 2023年6月26日
    00
  • spring boot 即时重新启动(热更替)使用说明

    以下是关于如何在Spring Boot项目中实现即时重新启动(热更替)的完整攻略。 1. 添加Spring Boot的devtools依赖 首先,在pom.xml文件中添加devtools依赖,如下所示: <dependencies> <!– 添加DevTools依赖 –> <dependency> <group…

    other 2023年6月27日
    00
  • python __init__与 __new__的区别

    Python __init__与__new__的区别 __init__和__new__都是Python中的特殊方法,用于对象的初始化和创建。它们在对象的生命周期中扮演不同的角色。 __new__方法 __new__是一个静态方法,用于创建对象实例。 __new__方法在对象创建之前被调用,它负责创建并返回一个新的对象实例。 __new__方法的第一个参数是类…

    other 2023年10月16日
    00
合作推广
合作推广
分享本页
返回顶部