该函数在头文件getopt.h
中。
函数原型:
int getopt(int argc,char * const argv[ ],const char * optstring);
返回值为int类型,其实解析成功一个选项时(可能这时看不懂,没关系,后面会解释)这个返回的就是一个字符,因为字符可以转为整数。
若解析完毕,则返回-1。
前两个参数大家都知道,就是main函数的参数选项:argc
是参数个数,argv
是参数的字符串数组(不要忘记argv[0]
是"./可执行文件名")。而第三个参数就是选项字符串。
什么是选项字符串?选项大家都知道,比如:
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
。
我们还需了解这个函数相关的全局变量,我们在写程序时需加上他们:
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设为该选项
关于这个函数的重点信息都介绍完了,现在就来看个简单的例子帮助理解吧(一定要理解注释!!!):
//注:此源代码来自于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); //将选项-v的参数字符串转为整数
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
测试下错误输入,如加入不存在的选项-p
:
./getopt_example -v -n5 -p
则会异常退出:
./getopt_example: invalid option -- 'p'
usage: …%
来源:CSDN
作者:seineo
链接:https://blog.csdn.net/weixin_44009743/article/details/104613599