int getopt(int argc
, char* const argv
[ ], const char *optstring
);
功能:
解析命令行参数,
参数
:
argc和argv分别代表参数个数和内容,跟main()函数里的命令行参数一样
optstring
: 为选项字符串,告知getopt可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号:“:”,则表示还有相关的参数,全域变量optarg即会指向此额外参数,如果在处理期间遇到了不符合optstring指定的其他选项,
getopt()将会显示一个错误消息,并将全局域变量设置为“?”字符,将全局域变量opterr设置为
0则将不会打印出错信息。
extern char* optarg
;
extern int optind
, opterr
, optopt
;
参数optarg:指向当前选项参数的指针
参数optind:再次调用getopt时的下一个argv指针索引
参数optopt:表示最后一个未知选项
参数optstring
: 比如
getopt(argc
, argv
, "td:ch:q::")
1. 单个字符,表示选项,这里一共有t、d、c、h、q五个选项
2. 单个字符后接一个冒号“:”表示该选项后必须跟一个参数,参数紧跟在选项后或者以空格隔开
3. 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟,如果后边跟一个参数,参数必须紧跟在选项后不能以空格隔开
测试代码
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_BUFF_SIZE (1024)
int main(int argc
, char *argv
[])
{
int iError
= -1;
unsigned int dwFontSize
= 16;
char acHzkFile
[MAX_BUFF_SIZE
] = { 0 };
char acFreetypeFile
[MAX_BUFF_SIZE
] = { 0 };
char acTextFile
[MAX_BUFF_SIZE
] = { 0 };
char cOpr
= 0;
acHzkFile
[0] = '\0';
acFreetypeFile
[0] = '\0';
acTextFile
[0] = '\0';
if(argc
< 2)
{
fprintf(stderr, "Usage: \n");
fprintf(stderr, "%s [-s Size] [-f freetype_font_file] [-h HZK] <text_file>\n", argv
[0]);
return -1;
}
while ((iError
= getopt(argc
, argv
, "s:f:h:")) != -1)
{
switch(iError
)
{
case 's':
{
dwFontSize
= strtoul(optarg
, NULL, 0);
break;
}
case 'f':
{
strncpy(acFreetypeFile
, optarg
, MAX_BUFF_SIZE
);
acFreetypeFile
[MAX_BUFF_SIZE
-1] = '\0';
break;
}
case 'h':
{
strncpy(acHzkFile
, optarg
, MAX_BUFF_SIZE
);
acHzkFile
[MAX_BUFF_SIZE
-1] = '\0';
break;
}
default:
{
printf("Usage: %s [-s Size] [-f font_file] [-h HZK] <text_file>\n", argv
[0]);
return -1;
break;
}
}
}
strncpy(acTextFile
, argv
[optind
], MAX_BUFF_SIZE
);
acTextFile
[MAX_BUFF_SIZE
-1] = '\0';
printf("dwFontSzie=%d, acHzkFile=%s, acFreetypeFile=%s, acTextFile=%s\n",
dwFontSize
, acHzkFile
, acFreetypeFile
, acTextFile
);
return 0;
}
测试结果