C中使用getopt函数解析命令行参数

1、简介

C语言中的getopt()函数是一个功能强大的命令行解析函数,属于POSIX标准,该函数的原型如下:

#include <unistd.h>

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

extern char *optarg;
extern int optind, opterr, optopt;

对于getopt()函数,前面两个函数参数和main函数传入的参数相同,可以直接从main函数传递给getopt()函数,第三个参数optstring是一种排序编码,包含了用户程序想要接收的所有单字母选项,例如,用户接收以下选项:-a -b -c,那么optstring参数就包含字符串"abc",其中的字符顺序以及字符是否存在并不重要,但是字符区分大小写。

如果选项字符串里面的字母后接着冒号":",则表示还有相关的参数,全局变量optarg即会指向这个额外参数,如果getopt()函数找不到符合的参数则会打印出错信息,并将全局变量optopt设置为"?"字符,如果不希望getopt()函数打印出错信息,需要将全局变量opterr设置为0,全局变量optind是下一个元素的索引,用于argv,系统将此值初始化为1。

该函数的返回值为,如果能找到符合参数的话,则返回此参数字母,如果参数不包含在optstring的选项字母,则返回"?"字符,分析结束则返回-1。

 

2、getopt函数使用

以下简单的示例程序使用getopt()函数处理两个程序选项,-n选项没有额外参数值,-t val期望一个参数值,代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int flags, opt;
    int nsecs, tfnd;

    nsecs = 0;
    tfnd = 0;
    flags = 0;
    while ((opt = getopt(argc, argv, "nt:")) != -1)
    {
        switch (opt)
        {
            case 'n':
                flags = 1;
                break;

            case 't':
                nsecs = atoi(optarg);
                tfnd = 1;
                break;
            
            default:
                fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]);
                exit(EXIT_FAILURE);
        }
    }

    printf("flags = %d, tfnd = %d, nsecs = %d, optind = %d\n",
        flags, tfnd, nsecs, optind);
    
    if (optind >= argc)
    {
        fprintf(stderr, "Expected argument after options\n");
        exit(EXIT_FAILURE);
    }

    printf("name argument = %s\n", argv[optind]);

    exit(EXIT_SUCCESS);
}

使用下面命令进行代码编译:

$ gcc getopt.c -o getopt

使用下面命令运行程序:

$ ./getopt -t 100 -n Lily

程序运行结果如下:

可以看到,输入的选项都被成功解析出来了。

 

3、小结

本文主要简单介绍了如何使用C中的getopt()函数来解析命令行参数。

posted @ 2021-05-10 23:02  liangliangge  阅读(477)  评论(0编辑  收藏  举报