int getopt(int argc,char const **argv, const char *optstring);
int getopt_long(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);
int getopt_long_only(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);
extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
选项串optstring可以包含下列元素:
1) 单个字符,一个选项字符"x"表示选项"-x"
2) 字符后面接一个冒号,说明后面跟随一个选项参数,选项字符"x:"表示选项和其参数"-x argument"。一个跟随的参数argument是否用空格引导与getopt()无关。
3) 字符后面接两个冒号,说明后面可能跟随一个选项参数,选项字符"x::"表示选项和其参数, " -x [argument]"。
4) 如果getopt()函数遇到一个在optstring中没有的字符或检测到一个缺选项的参数,它会向stderr中写一个错误信息并返回'?'。将 opterr置0可以使它不向stderr中写错误信息。如果optstring以':'开头,那么一个缺选项的参数会使':'返回。选项":x"
4) 当参数列已经到尾时getopt()函数返回-1,或者返回'?'当遇到一个未知的选项。参数列中选项的解释可能会被'—'取消,由于它引起getopt()给参数处理发送结束信号并返回-1
5) 在getopt()的返回中,optarg指向选项参数,变量optind包含下一个argv参数作为对getopt()下一次调用的索引。变量optopt保存最后一个由getopt()返回的已知的选项
6) 首字符是+号,选项字符"+x"表示遇到非选项立即结束。
7) 首字符是-号,选项字符"-x"表示每个选项都处理
#include <stdio.h>
#include <unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,”a:bcd”)) != -1)
switch(ch)
{
case ‘a’:
printf(“option a:’%s’/n”,optarg);
break;
case ‘b’:
printf(“option b :b/n”);
break;
default:
printf(“other option :%c/n”,ch);
}
printf(“optopt +%c/n”,optopt);
}
$./getopt –b
option b:b
$./getopt –c
other option:c
$./getopt –a
other option
$./getopt –a12345
option a:’12345’
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int tmp = 4;
while( (tmp = getopt(argc, argv,”;abck”)) != -1 )
{
printf(“-%c/t”, tmp);
int opt = optind ;
while( opt < argc )
{
if ( argv[opt][0] != '-' )
{
printf(“%s/t”, argv[opt]);
opt ++;
}
else
{
break;
}
}
printf(“/n”);
}
getchar();
}
getopt_long是getopt的扩展.getopt接受的命令行参数只可以是以(-)开头,而getopt_long还可以接受(--)开头的参数.一般以(-)开头的参数的标志只有一个字母,而以(--)开头的参数可以是一个字符串.如./mytest -d print --option1 hello --option2 world选项.
getopt返回我们指定的参数选项.同时将参数值保存在optarg中,如果已经分析完成所有的参数函数返回-1.这个时候optind指出非可选参数的开始位置.
getopt_long比getopt复杂一点,不过用途要比getopt广泛.struct option 指出我们可以接受的附加参数选项.
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
name: 指出长选项的名称(如我们的option1)
has_arg: 为0时表示没有参数值,当为1的时候表明这个参数选项要接受一个参数值.为2时表示参数值可以有也可以没有.
flag: 指出函数的返回值,如果为NULL,那么返回val;否则返回0.并将longindex赋值为选项所在数组(longopts)的位置.
val: 返回值或赋值给flag指向的变量
longindex:如果不为NULL, 指向一变量,表示 longopts中一个索引
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
int main (int argc, char **argv)
{
int c;
while (1)
{
struct option long_options[] =
{
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
/* 返回字符c,等同于 -c 选项 */
{"create", 0, 0, 'c'},
{"file", 1, 0, 0},
/* 数组结束 */
{0, 0, 0, 0}
};
/* getopt_long stores the option index here. */
int option_index = 0;
c = getopt_long (argc, argv, "abc:d:", long_options, &option_index);
/* Detect the end of the options. */
if (c == -1)
break;
switch (c)
{
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s/n", optarg);
break;
case 'a':
puts ("option -a/n");
break;
case 'b':
puts ("option -b/n");
break;
/* 可能是-c --creat参数指出来的 */
case 'c':
printf ("option -c with value `%s'/n", optarg);
break;
case 'd':
printf ("option -d with value `%s'/n", optarg);
break;
}
}
exit (0);
}
int getopt_long_long(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);
与 getopt_long类似 ,但 -也能指示一个长选项