C-optget

函数getopt()用来分析命令行参数,其函数原型和相关变量声明如下:

  • extern char *optarg;
  • extern int optind, // 初始化值为1,下一次调用getopt时,从optind存储的位置重新开始检查选项,也就是从下一个'-'的选项开始。
  • extern int opterr, // 初始化值为1,当opterr=0时,getopt不向stderr输出错误信息。
  • extern int optopt; // 当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回’?’。
  • int getopt(int argc, char * const argv[], const char *optstring);

optarg和optind是两个最重要变量。

  • optind被初始化设置指为1。
  • 每调用一次getopt()函数,返回一个选项,如果该选项有参数,则optarg指向该参数。
  • 在命令行选项参数再也检查不到optstring中包含的选项时,返回-1。
  • 字符串optstring,它是作为选项的字符串的列表。

optstring中的格式规范如下:

    1. 单个字符,表示选项,
    1. 单个字符后接一个冒号”:”,表示该选项后必须跟一个参数值。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
    1. 单个字符后跟两个冒号”:”,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩展)。
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>


int main(int argc, char *argv[])
{
	extern char *optarg;			// 指向参数
	extern int optind;				// 指向下一个argv参数
	extern int opterr;
	extern int optopt;				// 不能识别的字符,表示为?
	int opt;
	char *optstring = "a:b::";		//	一个表示必须要参数,两个表示可有可无
	// 参数可有可无,必须是紧跟参数;必须要有参数de可以加空格
	
	for (int i = 0; i < argc; i++)
	{
		printf("argv[%d] : %s\n", i, argv[i]);
	}
	putchar('\n');
	
	while ((opt = getopt(argc, argv, optstring)) != -1)
	{
		switch (opt)
		{
			case 'a':	// 用于正常执行参数项
				printf("option:%c, argv:%s\n", opt, optarg);
				break;
			case '?':	// 用于错入参数项
				opterr = 0;
				printf("error argc:%c, argv:%s\n", optopt, argv[optind - 1]);
			case ':':	// 用于参数项缺少参数输入
				printf("option:%c missing argument\n", optopt);
				break;
			default:
				printf("option:%c\n", opt);
				break;
		}
		
	}
	return 0;
}	
posted @ 2022-05-26 15:20  starc的miao  阅读(80)  评论(0)    收藏  举报