getopt(分析命令列參數)
相關函數
表標頭檔 #include<unistd.h>
定義函數 int getopt(int argc,char * const argv[ ],const char * optstring);
函數說明 getopt()用來分析命令列參數。參數argc和argv是由main()傳遞的參數個數和內容。參數optstring 則代表欲處理的選項字串。此函數會返回在argv 中下一個的選項字母,此字母會對應參數optstring 中的字母。如果選項字串裡的字母后接著冒號“:”,則表示還有相關的參數,全域變數optarg 即會指向此額外參數。如果getopt()找不到符合的參數則會印出錯資訊,並將全域變數optopt設為“?”字元,如果不希望getopt()印出錯資訊,則只要將全域變數opterr設為0即可。
傳回值 如果找到符合的參數則返回此參數字母,如果參數不包含在參數optstring 的選項字母則返回“?”字元,分析結束則返回-1。
範例 #include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,”a:bcde”))!= -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<string.h>
#include<stdio.h>
#include<unistd.h>static int opt_a=0;
static int opt_b=0;
static int opt_c=0;
static int opt_d=0;
static int opt_e=0;
static char * opt_a_arg=NULL;static void usage()
{
fprintf(stderr,"Usage:getopt [a arg] [b] [c] [d] [e]/n");
exit(1);}int main(int argc,char **argv)
{
int opt;
char opts[]="a:bcde";
opterr = 0;
while((opt = getopt(argc,argv,opts)) != -1){
switch(opt)
{
case 'a':
opt_a=1;
opt_a_arg=strdup(optarg);
break;
case 'b':
opt_b=1;
break;
case 'c':
opt_c=1;
break;
case 'd':
opt_d=1;
break;
case 'e':
opt_e=1;
break;
case '?':
usage();
break;
}
} if(opt_a || opt_b || opt_c|| opt_d || opt_e)
{
if(opt_a)
printf("opt a is set and arg is %s /n",opt_a_arg);
if(opt_b)
printf("opt b is set/n");
if(opt_c)
printf("opt c is set /n");
if(opt_d)
printf("opt d is set /n");
if(opt_e)
printf("opt e is set /n");
}else
usage();}/* Glib C 的getopt原始碼檔案中 內建的測試的代碼 */#ifdef TEST/* Compile with -DTEST to make an executable for use in testing
the above definition of `getopt'. */int
main (int argc, char **argv)
{
int c;
int digit_optind = 0; while (1)
{
int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789");
if (c == -1)
break; switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (digit_optind != 0 && digit_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 '?':
break; default:
printf ("?? getopt returned character code 0%o ??/n", c);
}
} if (optind < argc)
{
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("/n");
} exit (0);
}#endif /* TEST */