getopt函数分析
2010-03-31 13:57
281 查看
函数getopt主要用于拆分命令行参数,用这个函数就不自己写命令行参数解析程序了,以下代码摘自tcpdump源码,对这个函数比较感兴趣,故对此进行分析注释,因水平实在不敢恭维,不足之处希望能一起探讨
函数getopt()有三个参数,nargc,nargv就是命令行传过来的argc和argv字符串ostr,它是作为选项的字符串的列表。类似于ostr="ab:c:d:"这种形式,其中a,b,c,d为选项字符(单个字符表示),后面的:表示这个选项后面跟有参数。
例如ostr="ac:d:",程序名称为test,在命令行下运行该程序:
test -a -cfilename -d haha
在这个命令行参数中,-a和-d就是选项元素,去掉'-',a,c,d就是选项。filename是c的参数,haha是d的参数。
一般在程序中如下调用
while ((op = getopt(argc, argv, "ac:d:")) != -1)
{
switch (op)
{
...
}
}
实现选项,参数的处理
]#include <stdio.h> #include <stdlib.h> #include <string.h> int opterr = 1, /*指示是否显示错误信息*/ optind = 1, /*命令行参数argv的下标,因为小标0是程序名称,故初始化为1*/ optopt, /*选项字符*/ optreset; /* reset getopt */ char *optarg; /*选项后面的参数*/ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" int getopt(nargc, nargv, ostr) int nargc; char * const *nargv; const char *ostr; { extern char *program_name; static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ if (optreset || !*place) { /* update scanning pointer */ optreset = 0; // 如果下标>=命令行参数个数或者选项不是以字符-开始则出错 if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return (-1); } // 不能出现--这种形式 if (place[1] && *++place == '-') { /* found "--" */ ++optind; place = EMSG; return (-1); } } /* option letter okay? */ // 出现"-:"和"-a-b"或者在ostr中找不到nargv中指定的选项 if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { /* * if the user didn't specify '-' as an option, * assume it means -1. */ if (optopt == (int)'-') return (-1); if (!*place) ++optind; if (opterr && *ostr != ':') (void)fprintf(stderr, "%s: illegal option -- %c/n", program_name, optopt); return (BADCH); } // oil指向nargv中的选项在ostr中的位置 if (*++oli != ':') { /* 不需要参数 */ optarg = NULL; if (!*place) /* 这里处理"-ab"两个选项连着这种情况*/ ++optind; } else { /* 需要参数 */ if (*place) /* 处理"-cfilename"这种参数和选项中间没有空格的情况,a为选项,filename为参数 */ optarg = place; else if (nargc <= ++optind) { /*选项需要的参数缺少*/ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void)fprintf(stderr, "%s: option requires an argument -- %c/n", program_name, optopt); return (BADCH); } else /*参数和选项中间有空格*/ optarg = nargv[optind]; /*为下一次调用做准备*/ place = EMSG; ++optind; } return (optopt); /* dump back option letter */ }
函数getopt()有三个参数,nargc,nargv就是命令行传过来的argc和argv字符串ostr,它是作为选项的字符串的列表。类似于ostr="ab:c:d:"这种形式,其中a,b,c,d为选项字符(单个字符表示),后面的:表示这个选项后面跟有参数。
例如ostr="ac:d:",程序名称为test,在命令行下运行该程序:
test -a -cfilename -d haha
在这个命令行参数中,-a和-d就是选项元素,去掉'-',a,c,d就是选项。filename是c的参数,haha是d的参数。
一般在程序中如下调用
while ((op = getopt(argc, argv, "ac:d:")) != -1)
{
switch (op)
{
...
}
}
实现选项,参数的处理
相关文章推荐
- C/C++—— 分析命令行参数的getopt()函数使用介绍
- getopt 函数分析
- getopt()函数:分析命令行参数
- getopt() 分析命令行函数
- python的命令解析getopt.getopt()函数分析
- 函数说明 getopt()用来分析命令行参数
- linux getopt函数详细分析
- getopt()函数(分析命令行参数)
- getopt()和getopt_long()函数参数分析
- getopt函数的使用——分析命令行参数
- getopt函数分析命令行参数
- getopt--命令行参数分析函数
- fread()和fwrite()函数分析
- go ReadString() 函数分析
- 从 mian 函数开始一步一步分析 nginx 执行流程(一)
- linux-0.11调试教程,终端的初始化init_terminal_io ()函数分析
- Oracle分析函数之lead()和lag()函数
- oracle中sql分析函数
- Vue中之nextTick函数源码分析详解
- mat2gray函数原理分析