您的位置:首页 > 运维架构

getopt函数分析

2010-03-31 13:57 281 查看
函数getopt主要用于拆分命令行参数,用这个函数就不自己写命令行参数解析程序了,以下代码摘自tcpdump源码,对这个函数比较感兴趣,故对此进行分析注释,因水平实在不敢恭维,不足之处希望能一起探讨

]#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)

{

...
}

}

实现选项,参数的处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: