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 @   liangliangge  阅读(483)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示