一、簡介
getopt.h是C語言中的一個標準頭文件,它為命令行選項解析提供了便利的介面。如果你想讓自己的程序支持命令行選項,那麼getopt.h是非常實用的一個工具。
getopt.h提供了一個函數getopt(),該函數可以解析命令行中的選項和參數。在解析過程中,getopt()會自動識別選項的名稱、選項的參數、以及選項順序的先後關係。同時,getopt()還提供了一些額外的介面,可以設置選項解析的細節,比如是否支持長選項、選項的預設值等等。
二、基本使用
在使用getopt.h之前,我們需要在代碼中include這個頭文件,並在main函數的程序入口處添加下面這個語句,讓getopt()開始工作:
#include <getopt.h>
int main(int argc, char *argv[])
{
int opt = 0;
while ((opt = getopt(argc, argv, "a:b:c")) != -1) {
switch (opt) {
case 'a':
printf("Option a: %s\n", optarg);
break;
case 'b':
printf("Option b: %s\n", optarg);
break;
case 'c':
printf("Option c\n");
break;
case '?':
printf("Unknown option: %c\n", optopt);
break;
}
}
return 0;
}
上面的代碼中,opt代表解析得到的選項的名稱。如果選項具有參數,則可以通過optarg來獲得選項的參數值。在這個例子中,選項”a”和”b”後面都跟有參數,而選項”c”則沒有參數。
getopt()函數的第三個參數是一個字元串,表示支持的選項名稱。在上面的代碼中,”a:b:c”表示程序支持三個選項:”a”、”b”和”c”。其中,選項”a”和”b”後面跟有冒號,表示它們是帶參數的選項。
通過運行這個程序並添加選項參數,可以得到下面的輸出結果:
$ ./a.out -a hello -b world -c Option a: hello Option b: world Option c
三、長選項
除了短選項,getopt.h還支持長選項。長選項通常用更長、更可讀的名稱來表示選項,比如”–version”和”–help”等。
使用長選項需要進行一些額外的設置。首先,我們需要定義一個靜態的option數組,該數組描述了所有支持的長選項和對應的短選項。
#include <getopt.h>
static struct option long_options[] = {
{"version", no_argument, 0, 'v'},
{"input", required_argument, 0, 'i'},
{"output", required_argument, 0, 'o'},
{"help", no_argument, 0, 'h'},
{0, 0, 0, 0 }
};
int main(int argc, char *argv[])
{
int opt = 0;
while ((opt = getopt_long(argc, argv, "vi:o:h", long_options, NULL)) != -1) {
switch (opt) {
case 'v':
printf("Version 1.0\n");
break;
case 'h':
printf("Usage: %s [OPTION]...\n", argv[0]);
break;
case 'i':
printf("Input file: %s\n", optarg);
break;
case 'o':
printf("Output file: %s\n", optarg);
break;
case '?':
break;
}
}
return 0;
}
在上面的例子中,我們定義了一個靜態的option數組。該數組的每個元素都表示一個長選項和對應的短選項。數組的最後一個元素必須是全零的結構體,用來表示數組的結束。
通過運行這個程序並添加長選項,可以得到下面的輸出結果:
$ ./a.out --version --input=sample.txt --output=result.txt Version 1.0 Input file: sample.txt Output file: result.txt
四、支持選項參數預設值
有些選項可能需要有預設值以應對一些常見場景。比如,在一個圖片處理工具中,我們可能會讓用戶指定保存圖片的質量等級。但是,如果用戶沒有指定該選項,則可以使用一個默認的質量等級。
我們可以通過在定義選項時添加一個「=」後面的字元串來設置該選項的預設值。如果用戶沒有指定該選項,則會使用該選項的預設值。
#include <getopt.h>
static struct option long_options[] = {
{"quality=", required_argument, 0, 'q'},
{0, 0, 0, 0 }
};
int main(int argc, char *argv[])
{
int opt = 0;
const char *quality = "medium";
while ((opt = getopt_long(argc, argv, "q:", long_options, NULL)) != -1) {
switch (opt) {
case 'q':
quality = optarg;
break;
case '?':
break;
}
}
printf("Quality: %s\n", quality);
return 0;
}
在上面的例子中,我們為選項”quality”添加了一個”=”後面的字元串”default”,表示該選項的預設值為”default”。如果用戶沒有指定該選項,則quality變數的值就是”default”。
通過運行這個程序並添加選項參數,可以得到下面的輸出結果:
$ ./a.out -q high Quality: high $ ./a.out Quality: medium
五、支持多個參數
有些選項可能需要支持多個參數,比如指定多個文件夾或者多個文件名。在getopt.h中,我們可以通過雙冒號來表示一個選項帶有多個參數。
#include <getopt.h>
int main(int argc, char *argv[])
{
int opt = 0;
while ((opt = getopt(argc, argv, "a::")) != -1) {
switch (opt) {
case 'a':
if (optarg != NULL) {
printf("Option a: %s\n", optarg);
} else {
printf("Option a without argument\n");
}
break;
case '?':
break;
}
}
return 0;
}
在上面的例子中,我們為選項”a”添加雙冒號,表示該選項可以有多個參數。在程序中,我們通過判斷optarg的值是否為NULL,來判斷選項”a”是否帶有參數。
通過運行這個程序並添加選項參數,可以得到下面的輸出結果:
$ ./a.out -a hello -a world -a Option a: hello Option a: world Option a without argument
原創文章,作者:OONHZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/351598.html
微信掃一掃
支付寶掃一掃