欢迎来到天天文库
浏览记录
ID:38364526
大小:109.00 KB
页数:3页
时间:2019-06-11
《Linux程序设计——用getop()处理命令行参数》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux程序设计——用getop()处理命令行参数Nov21,2010Duy/ISIPKeywords:命令行getopt()在阅读RobHess的sift实现代码的时候看到getopt()函数,遂加以了解。网络上有很多关于此函数的介绍,基本的概念就不在此详细论述了,本文主要总结GNUgetopt()的一些点。Ubuntu下gcc遵循GNUgetopt()。在Linux下,使用Gcc等编译运行程序时,为了便于控制程序,修改程序中的变量的默认值,加强程序员和程序间的交互等,需要从命令行中输入一些参数。main(intargc,char**argv)函数中,argc统计命令行参数的个数,ar
2、gv指向这些参数,参数一般是以字符或字符串的形式存在的。getopt()函数就是对命令行输入进行处理的函数。为了便于理解,我把命令行输入参数分为三种:选项,选项参数,非选项操作数。getopt()选项以'-'开始,为单个字符,后面可以跟选项参数,一些和选项无关的输入为非选项参数。 getopt()函数声明如下: #include intgetopt(intargc,char*constargv[],constchar*optstring); externchar*optarg; externintoptind,opterr,optopt; optarg,optind,
3、opterr,optopt为四个全局变量。optstring定义选项字串。GNU提供的getopt()函数的主要特点是:1)扫描方式它的扫描方式是扫描整个命令行来寻找选项和选项参数,扫描结束后getopt()函数返回-1。如果遇到'--'则无条件终止扫描。在扫描的过程中getopt()使用全局变量optind作为argv的索引,相当于数组的下标。optind的初始值一般为1,即指向argv[1]。这是因为一般argv[0]为程序的名字,不可能是选项,所以从argv[1]开始扫描寻找选项。当然扫描前把optind设为0也没有问题,设为其他非0非1值也是可以的,但是这时候将从argv[opti
4、nd]开始扫描,不会扫描到整个命令行,同时optind应该介于[0argc-1]之间,否则会造成argv[]越界,可能引发段错误等。设optind初始值为1,扫描整个命令行。getopt()找到一个选项后,将会修改optind的值,使其指向下一个可能的选项。修改方式是:optind=当前选项索引+1或者2。当选项没有选项参数时候+1,有选项参数的时候+2,即要越过当前选项及其选各项参数,使optind指向下一个可能的选项。在这个扫描的过程中,除第一次调用getopt()函数外,其余次调用还进行了一种操作:重排agrv[]内容,即将当前选项及其选项参数移动到所有非选项操作数的前面,也就是将所
5、有非选项操作数移动到当前选项及其选项操作数的后面。这样当扫描结束后,argv[]中的内容被重新排列了,依次顺序为程序名称+选项及其选项参数+非选项操作数;optind被修改为指向第一个非选项操作数,这样argv[0]存储程序名称,argv[1]到argv[optind-1]存储选项及其选项参数,argv[optind]到argv[argc-1]存储非选项操作数;选项及其选项参数和非选项操作数的存储自身内部的存储顺序为输入顺序。2)返回值及optarg指向每次调用getopt()函数将会返回一个值,这个值一般为一个选项,如果输入了没有定义的选项,即选项无效,或者选项缺少选项参数,返回值可能是
6、':'或者'?',依设计而不同。如果一个选项有选项参数,那么optarg将指向这个参数,如果没有optarg为NULL;3)命令行错误控制。不正确的调用程序在所难免,这种错误有两种类型,要么是选项无效,要么是选项缺少选项参数。正常情况下,getopt()会为这两种情况输出自己的出错信息,并且返回'?'。如果选项无效,设为g,错误信息为:程序名称:invalidoption--'g'如果缺少选项参数,设选项为g,错误信息为: 程序名称:optionrequiresanargument--'g' 如果不希望输出任何错误信息,或更希望输出自定义的错误信息。可以采用以下两种方法来更改getopt(
7、)函数的出错信息输出行为:在调用getopt()之前,将opterr设为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息,返回值保持不变,为'?'。这样就可以人为控制错误输出信息,这时将不会区分错误类型。 如果optstring参数的第一个字符是冒号':',那么getopt()函数就会对错误保持沉默,并根据错误情况返回不同字符,如下: “选项无效”——getopt()返回'?',“缺少选项参数”——
此文档下载收益归作者所有