C语言——getopt函数

getopt()函数声明:

int getopt(int argc, char * const argv[],const char *optstring);

使用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 
#include 
int main(int argc,char * argv[]){
        int i;
        printf("%s\n","argv原序:");
        for(i = 0;i 

编译运行:

~/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

通过重复调用getopt()就可以一个一个获得命令行参数里的每一个选项字符。optind其实就是option index的缩写,就是指选项在数组argv的索引。

如果扫描不到任何选项字符,getopt()就会返回 -1。此时optind是argv参数数组第一个非选项参数元素的索引。

系统一开始就会将optind初始化为1。如果需要重新扫描argv的元素,可以手动将optind重置为1。
如果getopt()找到了另一个选项字符,就会返回那个字符,将更新变量optind,下次调用getopt()才可以继续扫描下一个选项字符。

注意:有一个特殊的参数 "–"会强制终止选项扫描,而不管扫描模式是什么。

当处理选项列表时,getopt()函数可以发现两类错误:

	 (1) 发现所提供的选项字符不在optstring中的错误。
     (2)发现后面要跟参数的选项没有提供参数的错误。

你可能感兴趣的:(C语言)