C/C++ 命令解析:getopt 方法详解和使用示例

C/C++ 命令解析:getopt 方法详解和使用示例一、简介getopt()方法是用来分析命令行参数的,该方法由Unix标准库提供,包含在<unistd.h>头文件中。 二、定义intgetopt(intargc,char*constargv[],constchar*optstring);externchar*optarg;externintoptind,opterr,o…

大家好,又见面了,我是你们的朋友全栈君。

一、简介

getopt() 方法是用来分析命令行参数的,该方法由 Unix 标准库提供,包含在 <unistd.h> 头文件中。

 

二、定义

int getopt(int argc, char * const argv[], const char *optstring);
 
extern char *optarg;
extern int optind, opterr, optopt;

getopt 参数说明:

  • argc:通常由 main 函数直接传入,表示参数的数量
  • argv:通常也由 main 函数直接传入,表示参数的字符串变量数组
  • optstring:一个包含正确的参数选项字符串,用于参数的解析。例如 “abc:”,其中 -a,-b 就表示两个普通选项,-c 表示一个必须有参数的选项,因为它后面有一个冒号

外部变量说明:

  • optarg:如果某个选项有参数,这包含当前选项的参数字符串
  • optind:argv 的当前索引值
  • opterr:正常运行状态下为 0。非零时表示存在无效选项或者缺少选项参数,并输出其错误信息
  • optopt:当发现无效选项字符时,即 getopt() 方法返回 ? 字符,optopt 中包含的就是发现的无效选项字符

 

三、实例分析

让我们通过一系列的实例来掌握 getopt 方法的使用吧。

1. 简单实例

OptDemo.c 如下:

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]) {
    int o;
    const char *optstring = "abc:"; // 有三个选项-abc,其中c选项后有冒号,所以后面必须有参数
    while ((o = getopt(argc, argv, optstring)) != -1) {
        switch (o) {
            case 'a':
                printf("opt is a, oprarg is: %s\n", optarg);
                break;
            case 'b':
                printf("opt is b, oprarg is: %s\n", optarg);
                break;
            case 'c':
                printf("opt is c, oprarg is: %s\n", optarg);
                break;
            case '?':
                printf("error optopt: %c\n", optopt);
                printf("error opterr: %d\n", opterr);
                break;
        }
    }
    return 0;
}

编译和运行:

C/C++ 命令解析:getopt 方法详解和使用示例

分析:

命令 gcc OptDemo.c -o OptDemo 是使用 gcc 把 OptDemo.c 编译成可执行程序,命名为 OptDemo

第一次运行 ./OptDemo -a -b -c afei 正常执行和输出

第二次运行 ./OptDemo -abc 由于选项 c 后没有输入参数,于是报错

第三次运行 ./OptDemo -d 由于选项 d 不是我们在 optstring 中预定义的选项,于是报错

 

2. 可选参数

一个冒号表示选项后必须有参数,没有参数就会报错。如果有两个冒号的话,那么这个参数就是可选参数了,即可有可没有。
OptDemo.c 如下:

#include <stdio.h>
#include <unistd.h>
 
void usage() {
    printf("Usage:\n");
    printf("\tOptDemo [-a] [-b] [-c message]");
}
 
int main(int argc, char *argv[]) {
    int o;
    const char *optstring = "abc::"; // 有三个选项-abc,其中c选项后有两个冒号,表示后面可选参数
    while ((o = getopt(argc, argv, optstring)) != -1) {
        switch (o) {
            case 'a':
                printf("opt is a, oprarg is: %s\n", optarg);
                break;
            case 'b':
                printf("opt is b, oprarg is: %s\n", optarg);
                break;
            case 'c':
                printf("opt is c, oprarg is: %s\n", optarg);
                break;
            case '?':
                printf("发生错误时提示用户正确的使用方式\n");
                usage(); // 提示使用说明
                break;
        }
    }
    return 0;
}

编译和运行:

C/C++ 命令解析:getopt 方法详解和使用示例

分析:

注意这里 可选参数 选项 -c 后面跟参数的时候,一定不能有空格。

但是如果是 必选参数,即选项后面只有一个冒号,则是有没有空格都可以。

 

3. 输入字符串转 int

由于 optarg 都是字符串类型的,所以当我们想要整型的输入参数时,会经常用到 atio() 这个方法,这里也简单介绍一下。
atoi (表示 ascii to integer) 是把字符串转换成整型数的一个函数,包含在 <stdlib.h> 头文件中,使用方式如下:

int num = atoi(optarg);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130618.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月29日 上午9:32
下一篇 2022年4月29日 上午9:32


相关推荐

  • pycharm如何同时编辑多行

    pycharm如何同时编辑多行实现像这个样子 ctrl 双击不松手 上下键 可以在同一列增加光标 ctrl shift alt 点击鼠标左键 可以在任意位置增加光标 设置好光标后就可以松开按键使用 shift ctrl 左右按键组合 可以选中光标后面的代码 进行多行编辑

    2026年3月18日
    1
  • seajs简易使用说明

    seajs简易使用说明一 引用 nbsp nbsp lt scriptsrc public js sea js data main main main gt lt script gt nbsp nbsp 在 html 页面使用 script 标签引入 seajs 文件 nbsp nbsp 设置属性 data main 指定你写的功能 js 代码文件 避免了在 html 页面上写 seajs use 代码 nbsp nbsp 当然也可以在 html 页面写你的代码 但是前

    2026年3月16日
    3
  • Cursor 接入 DeepSeek API 完全指南:手把手教你配置,月成本从 $20 降到 ¥5

    Cursor 接入 DeepSeek API 完全指南:手把手教你配置,月成本从 $20 降到 ¥5

    2026年3月16日
    2
  • WAP网站推广

    WAP网站推广WAP 网站该如何推广呢 做 WAP 首要的目的就是赚钱 别说我俗 我说的是是绝对的真理 哪个做 WAP 的 伟大 到不是为了赚钱 我一直在主做联盟 赢点 WAP 世纪应该是做的人比较多的了 不过都太扣量了 而且广告有很多重复 服务态度也不是很好 客服人员都是爱理不理 后来开始做了一些新的平台 当然不是指那些小平台 而是行业里面比较新的有一定规模的 我目前刚选择了个某联盟做的广告 当初做主

    2026年3月20日
    2
  • 超详细新手建站指南

    超详细新手建站指南概述对于一个建站新手来讲 最重要的莫过于 2 件事时间效率性价比换句话讲 对于非专业选手 在整个建站过程 如何省时省力 用相对简单的方式 花更少的钱建好网站是关键 基于上述 给大家带来一版适合新手的建站指南 供大家参考建站指南建站三大必备条件 域名 主机空间 虚机主机 服务器 建站程序无论你是自己建站还是外包第三方建站 都需要具备这三个要

    2026年3月19日
    2
  • 一文读懂 Spring Bean 的生命周期「建议收藏」

    一文读懂 Spring Bean 的生命周期「建议收藏」欢迎大家关注我的微信公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。一、前言今天我们来说一说SpringBean的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象。因为SpringBean的生命周期是除了IoC、AOP几个核心概念之外最重要概念,大家务必拿下。可Spring源代码又比较复杂,跟着跟着就不知道跟到哪里去了,不太好拿下呀。这倒是真的,而且网上一上来就各种贴流程源码,对初学者来说是真的一脸懵逼,就像字.

    2026年1月26日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号