頭檔案
#include <getopt.h>
函式原型
int getopt_long(int argc, char * CONST argv[],
const char *optstring,
const struct option *longopts, int *longindex);
函式說明
函式中的argc和argv通常直接從main()的兩個參數傳遞而來。optsting是選項參數組成的字元串,如果該字元串里任一字母后有冒號,那么這個選項就要求有參數。下一個參數是指向數組的指針,這個數組是option結構數組,option結構稱為長選項表,其聲明如下:
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
結構中的元素解釋如下:
const char *name:選項名,前面沒有短橫線。譬如"help"、"verbose"之類。
int has_arg:描述長選項是否有選項參數,如果有,是哪種類型的參數,其值見下表:
符號常量 數值 含義
no_argument 0 選項沒有參數
required_argument 1 選項需要參數
optional_argument 2 選項參數是可選的
int *flag:
如果該指針為NULL,那么getopt_long返回val欄位的值;
如果該指針不為NULL,那么會使得它所指向的結構填入val欄位的值,同時getopt_long返回0
int val:
如果flag是NULL,那么val通常是個字元常量,如果短選項和長選項一致,那么該字元就應該與optstring中
出現的這個選項的參數相同;
最後一個參數:longindex參數一般賦為NULL即可;如果沒有設定為NULL,那么它就指向一個變數,這個變數
會被賦值為尋找到的長選項在longopts中的索引值,這可以用於錯誤診斷。
使用man getopt_long,得到其聲明如下:
#include <getopt.h>
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
int getopt_long_only(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
說明:函式中的argc和argv通常直接從main()到兩個參數傳遞而來。optsting是選項參數組成的字元串,如
果該字元串里任一字母后有冒號,那么這個選項就要求有參數。下一個參數是指向數組的指針,這個數組是
option結構數組,option結構稱為長選項表,其聲明如下:
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
結構中的元素解釋如下:
const char *name:選項名,前面沒有短橫線。譬如"help"、"verbose"之類。
int has_arg:描述長選項是否有選項參數,如果有,是哪種類型的參數,其值見下表:
符號常量 數值 含義
no_argument 0 選項沒有參數
required_argument 1 選項需要參數
optional_argument 2 選項參數是可選的
int *flag:
如果該指針為NULL,那么getopt_long返回val欄位的值;
如果該指針不為NULL,那么會使得它所指向的結構填入val欄位的值,同時getopt_long返回0
int val:
如果flag是NULL,那么val通常是個字元常量,如果短選項和長選項一致,那么該字元就應該與optstring中
出現的這個選項的參數相同;
最後一個參數:longindex參數一般賦為NULL即可;如果沒有設定為NULL,那么它就指向一個變數,這個變數
會被賦值為尋找到的長選項在longopts中的索引值,這可以用於錯誤診斷。
註:GNU提供的getopt-long()和getopt-long-only()函式,其中,後者的長選項字串是以一個短橫線開始的
,而非一對短橫線。
範例
#include <stdio.h>
#include <getopt.h>
char *l_opt_arg;
char* const short_options = "nbl:";
struct option long_options[] = {
{ "name", 0, NULL, 'n' },
{ "bf_name", 0, NULL, 'b' },
{ "love", 1, NULL, 'l' },
{ 0, 0, 0, 0},
};
int main(int argc, char *argv[])
{
int c;
while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)
{
switch (c)
{
case 'n':
printf("MY NAME IS XL./n");
break;
case 'b':
printf("His name is ST./n");
break;
case 'l':
l_opt_arg = optarg;
printf("Our love is %s!/n", l_opt_arg);
break;
}
}
return 0;
}
[root@localhost wyp]# gcc -o getopt getopt.c
[root@localhost wyp]# ./getopt -n -b -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]#
[root@localhost liuxltest]# ./getopt -nb -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]# ./getopt -nbl forever
My name is XL.
His name is ST.
Our love is forever!