命令行参数解析函数 —— getopt()
getopt()函数声明如下:
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
该函数的argc和argv参数通常直接从main()的参数直接传递而来。optstring是选项字母组成的字串。如果该字串里的任一字符后面有冒号,那么这个选项就要求有选项参数。
当给定getopt()命令参数的数量 (
argc
)、指向这些参数的数组 (argv
) 和选项字串 (optstring
) 后,getopt()
将返回第一个选项,并设置一些全局变量。使用相同的参数再次调用该函数时,它将返回下一个选项,并设置相应的全局变量。如果不再有可识别的选项,将返回 -1
,此任务就完成了。
getopt()
所设置的全局变量包括:
char *optarg
——当前选项参数字串(如果有)。int optind
——argv的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到。- int opterr——这个变量非零时,getopt()函数为“无效选项”和“缺少参数选项,并输出其错误信息。
int optopt
——当发现无效选项字符之时,getopt()函数或返回'?'字符,或返回':'字符,并且optopt包含了所发现的无效选项字符。
以下面的程序为例:
选项:
选项:
- -n —— 显示参数一。
- -s —— 显示参数二。
- -l —— 显示参数三。
测试如下:
./a.out -n agrv[1] -s argv[2] -l argv[3]
运行结果如下:
agrv[1]
return value=110
argv[2]
return value=115
argv[3]
return value=108
return value=110
argv[2]
return value=115
argv[3]
return value=108
特别说明:
while ((iError = getopt(argc, argv, "ls:f:h:d:")) != -1)
这种情况就是l可以不跟参数,即使你跟了参数也不会把参数存放在optarg中,也就是说根当检测到-l时候,你可以用这个选项来处理一些事情,但是你不能使用optarg参数,不然会发生Segmentation fault;
但是如果你使用-s -f -h -d,则-s -f -h -d后面必须跟参数。