C/C++解析命令行参数
英语文化交流 > 技术博客 > C/C++解析命令行参数
C/C++解析命令行参数
时间:2017-10-12 13:30:31 程序员发展之路 分类:技术博客
相 关 库 函 数
#include <getopt.h>
int getopt(int argc, char * const argv[],const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
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);


eg1:

#include <stdio.h>
#include <getopt.h>
int main(int argc,char *argv[]) {
    int opt;
    char *optstring = "a:b:c:de"; // 分 别 代 表 -a,-b,-c,-d,-e命 令 行 参 数 ,其 中 带 :的 表 态 参 数 可 以 指 定 值 ,故 de无 法 指 定 值
    while((opt = getopt(argc,argv,optstring)) != -1){
        printf("opt = %c\n",opt);
        printf("optarg = %s\n",optarg);
        printf("optind = %d\n",optind);
        printf("argv[optind-1] = %s\n\n",argv[optind-1]);
    }
    return 0;
}
#./test_arg -a 1 -b 2 -c 3 -d -e
opt = a
optarg = 1
optind = 3
argv[optind-1] = 1
opt = b
optarg = 2
optind = 5
argv[optind-1] = 2
opt = c
optarg = 3
optind = 7
argv[optind-1] = 3
opt = d
optarg = (null)
optind = 8
argv[optind-1] = -d
opt = e
optarg = (null)
optind = 9
argv[optind-1] = -e
getopt_long函 数 在 getopt函 数 的 基 础 上 ,增 加 了 处 理 长 选 项 (--)的 功 能 。
因 此 多 了 2个 参 数 :const struct option *longopts, int *longindex
struct option
{
  const char *name;
  /* has_arg can't be an enum because some compilers complain about
     type mismatches in all the code that assumes it is an int.  */
  int has_arg;
  int *flag;
  int val;
};
/* Names for the values of the `has_arg' field of `struct option'.  */
# define no_argument	0
# define required_argument	1
# define optional_argument	2
   has_arg 指 明 是 否 带 参 数 值 ,其 数 值 可 选 :
no_argument (即  0) 表 明 这 个 长 参 数 不 带 参 数 (即 不 带 数 值 ,如 :--name)
required_argument (即  1) 表 明 这 个 长 参 数 必 须 带 参 数 (即 必 须 带 数 值 ,如 :--name Bob)
optional_argument(即 2)表 明 这 个 长 参 数 后 面 带 的 参 数 是 可 选 的 ,(即 --name和 --name Bob均 可 )
   longindex为 longopts对 应 的 下 标
 
#include <stdio.h>
#include <getopt.h>
//#include <unistd.h>
int main(int argc,char *argv[]) {
//    int opt;
//    char *optstring = "a:b:c:d:";
//
//    while((opt = getopt(argc,argv,optstring)) != -1){
//        printf("opt = %c\n",opt);
//        printf("optarg = %s\n",optarg);
//        printf("optind = %d\n",optind);
//        printf("argv[optind-1] = %s\n\n",argv[optind-1]);
//
//    }
    const char *short_options = "a:b:c:d";
    static struct option long_options[] ={
            {"no_arg",no_argument,NULL,'n'},
            {"required_arg",required_argument,NULL,'r'},
            {"optional_arg",optional_argument,NULL,'o'},
            {"test",1,NULL,'t'}
    };
    int opt = -1;
    int option_index = -1;
    while((opt = getopt_long(argc,argv,short_options,long_options,&option_index)) != -1){
        printf("opt = %c,%d\n",opt,opt);
        printf("optarg = %s\n",optarg);
        printf("optind = %d\n",optind);
        printf("argv[optind-1]=%s(short_arg)\n",argv[optind-1]);
        printf("long_option_index=%d\n\n",option_index);
    }
    return 0;
} 
 eg2:
 [root@localhost C]# ./test_arg -a 1 -b 2 -c 3 -d --no_arg --required_arg 1 --optional_arg 
opt = a,97
optarg = 1
optind = 3
argv[optind-1]=1(short_arg)
long_option_index=-1
opt = b,98
optarg = 2
optind = 5
argv[optind-1]=2(short_arg)
long_option_index=-1
opt = c,99
optarg = 3
optind = 7
argv[optind-1]=3(short_arg)
long_option_index=-1
opt = d,100
optarg = (null)
optind = 8
argv[optind-1]=-d(short_arg)
long_option_index=-1
opt = n,110
optarg = (null)
optind = 9
argv[optind-1]=--no_arg(short_arg)
long_option_index=0
opt = r,114
optarg = 1
optind = 11
argv[optind-1]=1(short_arg)
long_option_index=1
opt = o,111
optarg = (null)
optind = 12
argv[optind-1]=--optional_arg(short_arg)
long_option_index=2
  
最 后 说 说 getopt_long_only函 数 ,它 与 getopt_long函 数 使 用 相 同 的 参 数 表 ,在 功 能 上 基 本 一 致 ,只 是 getopt_long只 将 --name当 作 长 参 数 ,但 getopt_long_only会 将 --name和 -name两 种 选 项 都 当 作 长 参 数 来 匹 配 

本 文 出 自 “程 序 员 发 展 之 路 ” 博 客 ,请 务 必 保 留 此 出 处 http://****/2909336/1971684

随机阅读

Copyright © 2017 英语文化交流 All Rights Reserved.