By francis_hao    Jul 5,2017

 

getopt:分析命令行选项

概述

#include <unistd.h>
int getopt(int argc,
char
*
const argv[],
const
char
*optstring);
extern
char
*optarg;
extern
int optind, opterr, optopt;

 

描述

getopt()函数分析命令行参数,它的参数argc和argv就是程序传递给main()函数的参数,一个以'-'(不是仅有一个'-'或"--")开头的argv元素就是一个选项。'-'后面跟着的就是选项字符,调用多次getopt()函数会连续返回选项字符

变量optind是下一个要处理的元素在argv中的索引,系统初始化该变量为1,调用者可以给它复位为1,以重新扫描argv或扫描一个新的参数向量。

如果getopt()找到一个选项字符,它返回该字符,更新外部变量optind和静态变量nextchar,因此下一次调用getopt()函数时可以继续扫描剩余的选项。如果已经没有更多的选项字符了,getopt()则返回-1,然后,optind变为argv第一个不是选项元素的索引。

optstring是输入参数,它是一个包含需要进行处理的选项字符的集合,如果字符后面跟着一个冒号,表示该选项需要一个参数,因此getopt()将放置一个指向选项后面参数的指针给optarg,注意,形如-t 1和-t1都是可以的,都会将"1"传给optarg。两个冒号说明选项参数是可选的。

默认情况下,getopt()会排列它扫描到的argv中的内容,因此最终,所有不是选项的项会排在最后,另外实现的两种模式:
1、如果optstring的第一个字符是'+',或者环境变量POSIXLY_CORRECT置位,那么getopt()遇到非选项参数即停止,
2、如果optstring的第一个字符是'-',那么每个不是选项的参数,都被当作选项为1的参数处理
命令行中一个特殊的参数"--",当getopt()遇到它时,会强制参数扫描结束。

如果getopt()没有识别选项字符,它会打印一个错误信息到标准错误,存放这个字符到optopt并返回'?'。调用程序可以通过将opterr置0来防止产生错误信息的打印。

关于长选项参见man getopt_long。

 

示例

本示例为man手册上的例子,添加了一些打印以验证部分描述中的说明。

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

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

    nsecs =
0;
    flags =
0;
    printf("first of all optind is %d\n", optind);
    printf("---at the begining,list argv value---\n");
    for
(i=0; i<argc; i++){
        printf("argv[%u] is %s\n",i,argv[i]);
    }

    printf("-----------------------------\n");
    while
((opt = getopt(argc, argv,
"nt:"))
!=
-1)
{
        printf("current optind is %d\n", optind);
        switch
(opt)
{
            case
'n':
                flags++;
                break;
            case
't':
                nsecs = atoi(optarg);
                flags++;
                break;
            default:
/* '?' */
                fprintf(stderr,
"Usage: %s [-t nsecs] [-n] name\n",argv[0]);
                exit(EXIT_FAILURE);
        }

    }

    printf("---at the end,list argv value---\n");
    for
(i=0; i<argc; i++){
        printf("argv[%u] is %s\n",i,argv[i]);
    }

    printf("-----------------------------\n");
    printf("after all optind is %d\n", optind);

    printf("flags=%d; nsecs=%d\n", flags, nsecs);

    if
(optind >= argc)
{
        fprintf(stderr,
"Expected argument after options\n");
        exit(EXIT_FAILURE);
    }

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

    /* Other code omitted */

    exit(EXIT_SUCCESS);
}

 

一个执行实例:

做以下说明:

  1. optind会指向下一次getopt()函数要处理的argv的索引,最终会指向第一个不是选项的参数的argv中的索引(例中的"name")。
  2. argv中的参数会被重新排序,不是选项的参数会排在选项参数之后。
  3. 需要参数的选项,这两种形式是一样的:-t1和-t 1。

 

程序源码在github上,可以直接clone编译。

 


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/7123622.html

 

参考

【1】 man 3 getopt

 

 

 

C语言的getopt的更多相关文章

  1. 命令行选项解析函数(C语言):getopt()和getopt_long()

    命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...

  2. C语言getopt()函数的使用

    getopt(分析命令行参数)     相关函数表头文件         #include<unistd.h>定义函数         int getopt(int argc,char * ...

  3. linux C语言getopt()函数的使用

    getopt被用来解析命令行选项参数. #include <unistd.h> 函数及参数介绍 extern char *optarg; //选项的参数指针,如果选项字符串里的字母后接着冒 ...

  4. C语言-getopt函数

    #include<unistd.h> int getopt(int argc,char *const argv[],const char *optstring); extern char ...

  5. C语言命令行解析函数:getopt/getopt_long

    命令行工具下的参数选项有两种,长选项和短选项.短选项以-开头,后面跟单个字母:长选项以--开头,后面可跟多个字母. 一. getopt() 1.功能:解析命令行短选项参数 2.函数原型: #inclu ...

  6. c语言基础之getopt()

    getopt() #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); ...

  7. C语言查缺补漏

    7.用ucontext实现简单的用户空间协作多线程 转 http://blog.chinaunix.net/uid-26000137-id-3973004.html http://blog.csdn. ...

  8. 软件工程线上课程(C语言实践篇)学习心得总结

    林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...

  9. [转]Python 命令行参数和getopt模块详解

    FROM : http://www.tuicool.com/articles/jaqQvq 有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Pyt ...

随机推荐

  1. ctf题目writeup(5)

    2019.2.1 今天继续bugku的隐写杂项题:题目链接:https://ctf.bugku.com/challenges 1. 这道题下载后用wireshark打开...看了好久也没看出个所以然, ...

  2. logger模块的使用

    logging模块 下面是logger模块的配置文件,在写程序需要记录日志可以直接拿过来用,但是要经过相应配置的一些修改. 对于如何使用,在我上一篇随笔<ATM程序规范练习>中的记录日志的 ...

  3. js 实现字符串转日期进行比较大小

    代码如下 var a = '2016-01-01 12:12:12'; var b = '2016-01-01 12:12:13'; var al = new Date(a).getTime(); v ...

  4. stm32--FatFs调试过程(SPIFlash)

    移植方法参见我的另一篇博客:<stm32--FatFs移植(SPIFlash)>. 本文仅记录在初次移植完成后,遇到的问题,和解决的过程. 调试记录: 问题1:f_open返回3,即磁盘没 ...

  5. 线段树简单入门 (含普通线段树, zkw线段树, 主席树)

    线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...

  6. ios下 active 演示激活

    document.body.addEventListener('touchstart', function () { });

  7. ardupilot_gazebo仿真(一)

    ardupilot_gazebo仿真 标签(空格分隔): 未分类 ardupilot_gazebo仿真 官网网址 代码更新地址 Ardupilot Gazebo Plugin & Models ...

  8. C语言关于“输入包含多行数据,请处理到文件结束”的问题

    今天,笔者在做本校ACM校赛网络赛的时候,遇到输入格式中有这样的要求:输入包含多行数据,请处理到文件结束.题目的逻辑很简单,主要功能代码很容易实现,但是题目中没有“明确”指出控制台中输入数据以什么方式 ...

  9. Python 3 学习笔记之——基础语法

    1. a, b = a, a + b 先计算右边表达式,然后再同时赋值给左边. 2. 条件控制和循环语句 条件控制 if condition_1: statement_block_1 elif con ...

  10. memcached的认识

    <?php /* memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表 ...