C语言getopt函数的详细解析
1、头文件
#include <getopt.h> #include <stdlib.h> #include <unistd.h>
2、函数原型
int getopt(int argc,char * const argv[ ],const char * optstring);
返回值为int类型,其实解析成功一个选项时,这个返回的就是一个字符,因为字符可以转为整数。
若解析完毕,则返回-1或者EOF。
前两个参数是main函数的参数选项:
argc是参数个数;
argv是参数的字符串数组(不要忘记argv[0]是"./可执行文件名");
而第三个参数optstring就是选项字符串。
3、选项字符串
gcc -o test test.c
gcc -v
上面的-o、-v就是选项,其中-o是带参数的选项,其参数为test,而-v是不带参数的选项。
那么说了这么多,选项字符串其实就是一定格式的字符串,它决定了传给程序的参数argv中可以有哪些选项,而这些选项中哪些可以有参数。
然后运行程序时,getopt函数对argv进行解析,依次返回成功解析的选项,解析完毕后返回-1。
举个例子:选项字符串给定“ab:c::”,那么说明运行程序可以给最多三个参数,分别为-a,-b和-c,
其中-a,因为没有后跟冒号是不可以有参数的;
-b,因为后跟了一个冒号,是必须有参数的,参数可以有两种形式:
-b100,即参数紧跟选项。
-b 100,即选项与参数以空格分隔。
而-c,因为后跟了两个冒号,参数可有可无,且若有参数,参数必须紧跟选项,如-c200。
4、函数全局变量
char* optarg:指向目前解析的选项的参数 int optind:指向下一个选项的下标索引,
如./test -a 1 -b 2,最初还未解析时,optind为1,因为-a的下标为1,
解析完-a后optind的值就变为3,因为-b的下标为3,
解析完-b后,optint变为5,但argv[5]为空,说明解析完毕,此时getopt函数便返回-1。 int opterr:这个值在非0时会将错误信息标准输出到显示屏,但若被设为0,将不会输出错误信息。 int optopt:若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符?,同时将optopt设为该选项
5、举例
//注:此源代码来自于CMU 15-213 Recitation 6,侵删 #include <stdlib.h> #include <stdio.h> #include <getopt.h> //记得包含头文件! int main(int argc, char *argv[]) { extern char *optarg; //这两行就是我们所说的,需要在程序中加入的关于getopt函数的全局变量 extern int optind, opterr, optopt; int verbose = 0; //一个输出的判断条件 int n = 0; //用于计数 char opt; //用于存getopt函数的返回值 //下面循环的判断条件中,选项字符串为:vn:,意思是选项-v没有参数,-n必须有参数 //一直循环直到解析完毕 while ((opt = getopt(argc, argv, "vn:")) != -1) { switch (opt) { case 'v': //若解析到的返回值是v,即选项-v且没加参数 verbose = 1; //将输出判断条件置1 break; case 'n': //若解析到的返回值为n,即选项-n且加了参数 n = atoi(optarg); //将选项-n的参数字符串转为整数 break; default: //若由于出错返回值是其他(比如返回上述的?) fprintf(stderr, "usage: …"); //标准错误输出 exit(1); //并异常退出程序 } } int i; for (i = 0; i < n; i++) { //根据解析结果得到的n和verbose输出 if (verbose) printf("%d\n", i); } printf("Done counting to %d\n", n); return 0; }
./getopt_example -v -n5 结果: 0 1 2 3 4 Done counting to 5
参考:
https://blog.csdn.net/weixin_44009743/article/details/104613599