该函数每解析完一个选项 , 就返回该选项字符 。
如果选项带参数,参数保存在optarg中 。如果选项带可选参数,而实际无参数时,optarg为NULL 。
当遇到一个不在optstring指明的选项时,返回字符‘?’ 。如果在optstring指明某选项带参数而实际没有参数时,返回字符‘?’或者字符‘:’ , 视optstring的第一个字符而定 。这两种情况选项的实际值被保存在optopt中 。
当解析错误时,如果opterr为1则自动打印一条错误消息(默认),否则不打印 。
当解析完成时,返回-1 。
每当解析完一个argv,optind就会递增 。如果遇到无选项参数,getopt默认会把该参数调后一位,接着解析下一个参数 。如果解析完成后还有无选项的参数,则optind指示的是第一个无选项参数在argv中的索引 。
函数getopt_long()的工作方式类似于getopt() , 不过它还能接收长选项 。在接收长选项之前 , 我们必须定义个一个结构体数组变量longopts,指明我们希望获取的长选项 。
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
含义如下:
name指明长选项的名称;
has_arg指明该选项是否带参数 , 1为是 , 0为否 , 2为可?。?
flag指明长选项如何返回,如果flag为NULL,则getopt_long返回val 。否则返回0,flag指向一个值为val的变量 。如果该长选项没有发现,flag保持不变;
val指明返回的值,或者需要加载到被flag所指示的变量中 。
option数组的最后一个元素必须全部填充0.
getopt_long的最后一个参数longindex在函数返回时指向被搜索到的选项在longopts数组中的下标 。longindex可以为NULL,表明不需要返回这个值 。
getopt_long_only类似于getopt_long,但是它把'-'开头的选项当作长选项来处理 。如果该选项与长选项不匹配,而与短选项匹配,则可以作为短选项解析 。
在短选项找到的时候 , getopt_long和getopt_long_only的表现和getopt一样 。如果长选项找到了,如果flag为 NULL,返回val,否则返回0 。错误情况的处理和getopt一样,只是返回'?'时还可能是别的情况引起的:选项含糊不明确或者无关参数 。
我们拿Linux手册的一个例子来说事 。
#include stdio.h/* for printf */
#include stdlib.h/* for exit */
#include getopt.h
int
main (int argc, char **argv) {
int c;
int digit_optind = 0;
while (1) {
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, ’c’},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};
c = getopt_long (argc, argv, "abc:d:012",
long_options, option_index);
if (c == -1)
break;
switch (c) {
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;
case ’0’:
case ’1’:
case ’2’:
if (digit_optind != 0digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;
case ’a’:
printf ("option a\n");
break;
case ’b’:
printf ("option b\n");
break;
case ’c’:
printf ("option c with value ‘%s’\n", optarg);
break;
case ’d’:
printf ("option d with value ‘%s’\n", optarg);
break;
case ’?’:
break;
default:
printf ("?? getopt returned character code 0%o ??\n", c);
推荐阅读
- 鸿蒙系统主题套图壁纸高清,鸿蒙主题图片素材
- go语言连接wifi,go语言连接数据库应该使用
- 小米电视为什么有黑斑呢,小米电视有黑点
- b站兼职不露脸直播,b站兼职不露脸直播怎么弄
- php1亿数据分页 php分页页码动态的实现
- 游戏动画视频叫什么,做游戏动画的叫什么职业
- 什么是手机靓号直播卖货,什么是手机靓号直播卖货平台
- 莒南直播运营招聘,莒南直播运营招聘信息
- c语言怎么写数组函数 c语音数组函数