zoukankan      html  css  js  c++  java
  • 命令行参数解析:getopt,getopt_long

           #include <unistd.h>
    
           int getopt(int argc, char * const argv[],
                      const char *optstring);
    
           extern char *optarg; /* 当前选项对应的参数,or NULL */
           extern int optind, opterr, optopt;
    /* optind 再次调用getopt()时在argv中的索引; 
     * 遇到无法解析选项时,返回 '?' ,显示错误消息,若不想显示则opterr=0;
     * optopt 最后一个未知选项的索引; 
           #include <getopt.h>
    
           int getopt_long(int argc, char * const argv[],
                      const char *optstring,
                      const struct option *longopts, int *longindex);
    
           int getopt_long_only(int argc, char * const argv[],
                      const char *optstring,
                      const struct option *longopts, int *longindex);
    
       Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
    
           getopt(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE
           getopt_long(), getopt_long_only(): _GNU_SOURCE

    argc,**argv: main函数传递

    *optstring: 对于每一个字符选项而言,'c'表示无参数;'c:'表示有参数,形式 "-c Argument"/"-cArgument";'c::'表示参数可有可无,若有形式只能是'-cArgument'。

    struct option数组最后的元素全0,*longindex保存当前数组索引。

               struct option {
                   const char *name;    /* 长选项名字 */
                   int         has_arg;      /* 选项是否有参数:no_argument,0;required_argument,1;optional_argument,2 */
                   int        *flag;            
                   int         val;
               };
    /* *flag,val仅作用于长选项
     * flag==NULL时,val;
     * flag!=NULL时,返回 0,val保存到flag中
    */

    getopt成功,返回选项字符;解析完毕返回-1;遇到不在optstring中的选项,返回 '?';遇到缺少参数的选项,返回 ':'(若optstring第一个字符为 ':',否则返回 '?'。

    getopt_long 短选项,返回对应选项字符;长选项时,返回val(flag==NULL),返回0(flag!=NULL,保存val);其他情况同getopt。

    getopt_long例子

    #include<string.h>
    #include<strings.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<getopt.h>
    
    int reload,time;
    
    static const struct option long_options[]=
    {
        {"force",no_argument,NULL,'f'},
        {"reload",no_argument,&reload,2},
        {"time",required_argument,NULL,'t'},
        {NULL,0,NULL,0}
    };
    int main(int argc, char *argv[])
    {
        int opt=0,options_index=0;
        while((opt=getopt_long(argc,argv,"frt:?h",long_options,&options_index))!=-1)
        {
            switch(opt)
            {
                case 'f':
                    printf("case f opt=%c",opt);
                    break;
                case 'r':
                    printf("case r opt=%c",opt);
                    break;
                case 't':
                    printf("case t opt=%c",opt);
                    break;
                case 0:
                    printf("case 0 opt=%c",opt);
                    break;
            }
            printf(" optarg=%s	 optind=%d	 opterr=%d	 optopt=%d	 ",optarg,optind,opterr,optopt);
            printf(" reload=%d,time=%d 
    ",reload,time);
        }
        return 0;
    }

    getopt例子

    #include<string.h>
    #include<strings.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<getopt.h>
    #include<unistd.h>
    
    int main(int argc, char *argv[])
    {
        int opt;
        while((opt=getopt(argc,argv,"frt:?h"))!=-1)
        {
            switch(opt)
            {
                case 'f':
                    printf("case f opt=%c ",opt);
                    break;
                case 'r':
                    printf("case r opt=%c ",opt);
                    break;
                case 't':
                    printf("case t opt=%c ",opt);
                    break;
            }
            printf("optarg=%s
    ",optarg);
        }
        return 0;
    }
  • 相关阅读:
    《移动开发者周刊》第十一期
    2012安卓巴士开发者沙龙成都站大家抓紧报名
    23岁那年你正处在哪个状态?现在呢?
    《老罗Android开发视频教程》老罗来交国庆的答卷了
    程序员,你的一千万在哪里?
    《老罗Android开发视频教程》更新
    2012全球开发者大会项目投资一对一相亲会
    windows远程桌面
    [LeetCode] NQueens
    [LeetCode] Pascal's Triangle II
  • 原文地址:https://www.cnblogs.com/jokoz/p/5143438.html
Copyright © 2011-2022 走看看