getopt_long函数

先看一段代码:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

void print_help(void);

int main(int argc, char **argv)
{
	const char *optstrings = "ngl:i::";//所有的短选项,单冒号是必须要有参数,双引号是选择性的有否参数,其它是无须参数
	const struct option longopts[] = {
			{"name", 0, NULL, 'n'},
			{"gf_name", 0, NULL, 'g'},
			{"love", 1, NULL, 'l'},
			{"istrue", 2, NULL, 'i'},
	};
/* 短选项用一个字符串就可以表示它的信息了(哪个选项是有参数阿等等信息),但对于长选项来说,每个选项都是好几个字符,
* * 所有我们用一个option结构体数组表示长选项的信息,每个结构体第一个参数表示长选项的名字,第二项是个数值用来决定
* * 此长选项是否要带参数,第三个选项我们一般都置为NULL,用来决定getopt_long函数的返回值就是第四个选项的值,所以
* * 第四个选项是此长选项相对应的短选项值,因此一旦此函数读到此长选项时,就返回与此长选项相对应的短选项,我们就可以
* * 好判断了。
*/
      while(1) {
		int c;
		c = getopt_long(argc, argv, optstrings, longopts, NULL);
/* 这里要清楚一个道理,就是此函数读取参数,读取到什么时候开始返回,比如说,我们设置了无参数短选项-n,然后后面还有非
* * 的一串字符,比如在此程序里就是“woaini”,经过debug我们发现,此函数读完‘-n’选项后,返回n,然后紧随着再次读取,
* *发现没有选项了,尽管此时还有一串“woaini”字符串,它依然返回一个-1值
*/
                if (c == -1)
			break;

		switch (c)
		{
		case 'n':
			printf("my name is chengyang\n");
			break;
		case 'g':
			printf("her name is XXX\n");
			break;
		case 'l':
			printf("our love is %s\n", optarg);
			break;
		case 'i':
			if (optarg != NULL)
				printf("it is %s\n", optarg);//optarg代表参数
			else printf("it is not true!\n");
			break;
		case '?':
			print_help();
			exit(1);
			break;
		default:
			print_help();
			exit(1);
		}
		printf("the optind is %d\n the argc is %d\n", optind, argc);//测试了解optind
	}

	if ((argc - optind) != 1) {
		print_help();
		exit(1);
	}
	return 0;

}

void print_help()
{
	printf("the usage: [options] claim of love\n ");
}

短选项参数的指定:
当使用单冒号(必须要有参数)时,我们可以这么指定:-l [augment],中间可以有空格也可以没有空格
当使用双冒号时(可以没有参数)时,我们必须这么指定:-i[augment],也就是说中间必须只能没有空格
长选项参数指定:
一律用如此形式:--istrue=true,中间用=号

argc和optind的区别:
argc: 是所带字符串的个数,包括程序本身;
optind:初始化的时候,optind就是1,可以理解为此时的1是程序本身个数,然后后面的每一个选项就算一个,以及选项后的参数
(注意,如果用短选项中间没有空格指定了一个参数的话,那么此选项和参数本身只能算一个字符串,加一)算一个,

注意:最后的“woaini”,因为它不是选项所以它不能算到optind中去,所以最后,正确的话,那么argc比optind要大一。

你可能感兴趣的:(getopt_long函数)