C中使用getopt函数解析命令行参数
1、简介
C语言中的getopt()函数是一个功能强大的命令行解析函数,属于POSIX标准,该函数的原型如下:
#include <unistd.h> int getopt(int argc, char *const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt;
对于getopt()函数,前面两个函数参数和main函数传入的参数相同,可以直接从main函数传递给getopt()函数,第三个参数optstring是一种排序编码,包含了用户程序想要接收的所有单字母选项,例如,用户接收以下选项:-a -b -c,那么optstring参数就包含字符串"abc",其中的字符顺序以及字符是否存在并不重要,但是字符区分大小写。
如果选项字符串里面的字母后接着冒号":",则表示还有相关的参数,全局变量optarg即会指向这个额外参数,如果getopt()函数找不到符合的参数则会打印出错信息,并将全局变量optopt设置为"?"字符,如果不希望getopt()函数打印出错信息,需要将全局变量opterr设置为0,全局变量optind是下一个元素的索引,用于argv,系统将此值初始化为1。
该函数的返回值为,如果能找到符合参数的话,则返回此参数字母,如果参数不包含在optstring的选项字母,则返回"?"字符,分析结束则返回-1。
2、getopt函数使用
以下简单的示例程序使用getopt()函数处理两个程序选项,-n选项没有额外参数值,-t val期望一个参数值,代码如下所示:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { int flags, opt; int nsecs, tfnd; nsecs = 0; tfnd = 0; flags = 0; while ((opt = getopt(argc, argv, "nt:")) != -1) { switch (opt) { case 'n': flags = 1; break; case 't': nsecs = atoi(optarg); tfnd = 1; break; default: fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]); exit(EXIT_FAILURE); } } printf("flags = %d, tfnd = %d, nsecs = %d, optind = %d\n", flags, tfnd, nsecs, optind); if (optind >= argc) { fprintf(stderr, "Expected argument after options\n"); exit(EXIT_FAILURE); } printf("name argument = %s\n", argv[optind]); exit(EXIT_SUCCESS); }
使用下面命令进行代码编译:
$ gcc getopt.c -o getopt
使用下面命令运行程序:
$ ./getopt -t 100 -n Lily
程序运行结果如下:
可以看到,输入的选项都被成功解析出来了。
3、小结
本文主要简单介绍了如何使用C中的getopt()函数来解析命令行参数。