命令行参数解析: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;
}
原文地址:https://www.cnblogs.com/jokoz/p/5143438.html