getopt()函数的使用

        每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用getopt来实现的。
在Linux下使用getopt写程序是一种比较方便的事情,下面来简单的介绍一下getopt的使用。

        在讨论参数处理之前,我们先明确两个概念:选项、选项参数
        gcc -g -o test test.c
我们经常使用上面的命令来编译程序,这里g和o就是选项,其中test就是o的选项参数。

getopt()函数声明和与其有关的全局变量如下:

首先是函数声明:


#include <unistd.h>
extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;
int getopt(int argc, char * const *argv, const char *optstring);

        先看一个例子:
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv) {

	int i;
	int ch;
	printf("optind:%d, opterr:%d\n", optind, opterr);
	printf("---------\n");

	while((ch = getopt(argc, argv, "ab:c:d")) != -1) {
		switch(ch) {
			case 'a': {
				printf("a\n");
				break;
			}
			case 'b': {
				printf("b\n");
				break;
			}
			case 'c': {
				printf("c\n");
				break;
			}	
			case 'd': {
				printf("d\n");
				break;
			}
		}

	}

	printf("optind:%d\n", optind);

	for(i=0; i<argc; ++i) {
		printf("%s\n", argv[i]);
	}	
}

运行结果:

[feng@feng test]$ ./test_getopt -a -b hello -c world -d china yf
optind:1, opterr:1
---------
a
b
c
d
optind:7
./test_getopt
-a
-b
hello
-c
world
-d
china
yf

        分析如下:
getopt()每调用一次返回一个选项。
argc 和 argv 很显然就是 main 函数的两个参数。
        字符串 optstring 可以包含下列元素:单个字符,字符后面接一个冒号说明后面跟随一个选项参数,字符后面接两个冒号说明后面跟随一个可有可无的选项参数。例如,一个选项字符 "x" 表示选项 "-x" ,选项字符 "x:" 表示选项和其参数 "-x argument",选项字符 "x::" 表示选项 x 的参数是可选的(“::” 是 GNU 增加的,不一定在所有的UNIX 系统下都可以使用)。
getopt()的返回后,如果有选项参数的话 optarg 指向选项参数,并且变量 optind 包含下一个 argv 参数作为对 getopt() 下一次调用的索引。变量 optopt 保存最后一个由 getopt() 返回的已知的选项。
当参数列已经到结尾时getopt()函数返回-1,当遇到一个未知的选项时 getopt 返回'?'。参数列中选项的解释可能会被'--'取消,由于它引起 getopt()给参数处理发送结束信号并返回-1。

        很多时候,我们不希望输出任何错误信息,或更希望输出自己定义的错误信息。可以采用以下两种方法来更改getopt()函数的出错信息输出行为:
(1)在调用getopt()之前,将opterr设置为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息。
(2)如果optstring参数的第一个字符是冒号,那么getopt()函数就会保持沉默,并根据错误情况返回不同字符,如下:
“无效选项” ―― getopt()返回'?',并且optopt包含了无效选项字符(这是正常的行为)。
“缺少选项参数” ―― getopt()返回':',如果optstring的第一个字符不是冒号,那么getopt()返回'?',这会使得这种情况不能与无效选项的情况区分开。
例如optstring为:a:b::c,表示a带一个参数,b可选,c不带参数
如果输入d,“无效选项“,getopt返回'?'
如果输入的a忘记带参数,“缺少选项参数”,getopt应返':' ;如果不再optstring的第一个字符不是':'的话,那么将会把这个错当成"无效参数",从而getopt返回'?';从而无法区别错误类型。


你可能感兴趣的:(c,linux,unix,gcc)