C语言——getopt函数
getopt()函数声明:
int getopt(int argc, char * const argv[],const char *optstring);
- 1
使用getopt()函数要引用头文件unistd.h。
getopt()函数作用:
解析命令行参数中的选项,选项是以’-'开头的字符。
与getopt相关的重要的全局变量
extern char* optarg;用来保存选项的参数
extern int optind;用来记录下一个检索位置
extern int opterr;是否将错误信息输出到stderr,设置为0时表示不输出,默认为1
extern int optopt;保存不在optstring中的选项
getopt()函数参数说明:
argc、argv:分别来自命令行传给main()函数的参数argc(参数个数)和argv(参数数组)。
optstring:是一个包含合法选项字符的字符串。
对optstring中的选项字符的处理:
(1)选项字符后面跟一个冒号“:",则此选项后要带一个参数,可以通过全局变量 optarg来获取 。
(2)选项字符后面跟两个冒号“::“,则此选项的参数是可选的,即如果提供选项参数,则选项参数必须紧跟在选项字符后面,不能以空格隔开,如”o::",则命令行中应该是这样的"-oarg",同样用optarg获取,如果没有提供值,则optarg为0
(3)如果optstring包含“W;",即W后面一个分号,那么当命令行中出现“-W foo”,它们就会被当成是一个长选项,即“–foo”。
(4)如果optstring的第一个字符是冒号’:’,那么getopt() 不会打印错误信息,返回双引号’:’。默认情况下, getopt()会在标准错误中打印错误信息。
(5)如果输入的选项字符不在合法选项字符optstring中,getopt()函数返回“?”,并将错误的字符放在optopt全局变量中。
getopt()对参数处理的三种情况:
(1)默认情况下,getopt()会在扫描时重新排列argv的内容。最终,所有非选项参数都会排在最后面。
(2)如果optstring的第一个字符是 '+'或者设置了环境变量POSIXLY_CORRECT,那么一旦遇到非选项参数,就会停止处理选项(即不会重新排列)。
(3)如optstring 第一个字符是 ‘-’,那么每一个非选项参数都将被处理,好似它们就是选项的参数。(也不会重新排列)
我们来看一个实例:
#include <unistd.h>
#include <stdio.h>
int main(int argc,char * argv[]){ int i; printf("%s\n","argv原序:"); for(i = 0;i <argc;i++){ printf("%s ",argv[i]); } printf("\n"); printf("START@optind:%d,opterr:%d\n",optind,opterr); int ret; while((ret = getopt(argc,argv,"aW;b:c:de::")) != -1){ switch(ret){ case 'a': printf("Having option -a\n"); break; case 'b': printf("having option -b,and its argument is %s\n",optarg); break; case 'c': printf("having option -c,and its argument is %s\n",optarg); break; case 'd': printf("Having option -d\n"); break; case 'e': printf("having option -e,it is optional,and its argument is %s\n",optarg); break; case '?': printf("Unknown option -%c\n",(char)optopt); break; } } printf("END@optind:%d,argv[%d]:%s\n",optind,optind,argv[optind]); printf("%s\n","argv现序:"); for(i = 0;i <argc;i++){ printf("%s ",argv[i]); } printf("\n"); return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
编译运行:
~/Desktop/MyC$ gcc test8.c -o test8
~/Desktop/MyC$ ./test8 MMMnnnn -a HHHHH -W newWWWW -b hello -c world -d -eHaha MMMMM
argv原序:
./test8 MMMnnnn -a HHHHH -W newWWWW -b hello -c world -d -eHaha MMMMM
START@optind:1,opterr:1
Having option -a
having option -b,and its argument is hello
having option -c,and its argument is world
Having option -d
having option -e,it is optional,and its argument is Haha
END@optind:9,argv[9]:MMMnnnn
argv现序:
./test8 -a -W -b hello -c world -d -eHaha MMMnnnn HHHHH newWWWW MMMMM
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
通过重复调用getopt()就可以一个一个获得命令行参数里的每一个选项字符。optind其实就是option index的缩写,就是指选项在数组argv的索引。
如果扫描不到任何选项字符,getopt()就会返回 -1。此时optind是argv参数数组第一个非选项参数元素的索引。
系统一开始就会将optind初始化为1。如果需要重新扫描argv的元素,可以手动将optind重置为1。
如果getopt()找到了另一个选项字符,就会返回那个字符,将更新变量optind,下次调用getopt()才可以继续扫描下一个选项字符。
注意:有一个特殊的参数 "–"会强制终止选项扫描,而不管扫描模式是什么。
当处理选项列表时,getopt()函数可以发现两类错误:
(1) 发现所提供的选项字符不在optstring中的错误。 (2)发现后面要跟参数的选项没有提供参数的错误。
- 1
- 2
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/87898328
- 点赞
- 收藏
- 关注作者
评论(0)