c语言命令行选项处理函数getopt和getopt_long() 函数使用
經(jīng)常接觸Linux的同學(xué)應(yīng)該有這樣的體驗,當(dāng)遇到一個不會使用的命令時通常敲一下xCmd -h或者xCmd --help來獲取命令提示,例如tcpdump命令或者iptables命令,像這樣的選項僅僅是獲取提示幫助的,實現(xiàn)起來不會很難,但如果考慮到一些復(fù)雜的選項,比如說下面這條命令:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT這個命令包含多個選項,且選項或許還帶有參數(shù),如果完全由自己進行實現(xiàn)的話,可以是可以的,但是難免要花費一些功夫,尤其是在已有現(xiàn)成的實現(xiàn)情況下,函數(shù)getopt和getopt_long就是專門用來解析命令行參數(shù)的,一個是用來處理短選項(-開頭)一個長選項(--開頭)功能強大易用,簡單方便,媽媽再也不擔(dān)心我寫錯代碼了^_^。
先看下getopt函數(shù)定義和聲明:
#include <unistd.h>int getopt(int argc, char * const argv[],const char *optstring);extern char *optarg; extern int optind, opterr, optopt;給定了命令參數(shù)的數(shù)量 (argc)、指向這些參數(shù)的數(shù)組 (argv) 和選項字符串 (optstring) 后,getopt() 將返回第一個選項,并設(shè)置一些全局變量。使用相同的參數(shù)再次調(diào)用該函數(shù)時,它將返回下一個選項,并設(shè)置相應(yīng)的全局變量。如果不再有識別到的選項,將返回 -1,此任務(wù)就完成了。getopt() 所設(shè)置的全局變量包括:optarg——指向當(dāng)前選項參數(shù)(如果有)的指針。 optind——再次調(diào)用 getopt() 時的下一個 argv 指針的索引。 optopt——最后一個已知選項。對于每個選項,選項字符串 (optstring) 中都包含一個對應(yīng)的字符。具有參數(shù)的選項(如示例中的 -l 和 -o 選項)后面跟有一個 : 字符。可以重復(fù)調(diào)用 getopt(),直到其返回 -1 為止;示例:
#include <stdio.h> #include <unistd.h>/* 處理abch四個選項,其中bc含有參數(shù) */ static const char *optString = "ab:c:h";void main(int argc, char **argv) {int opt;opt = getopt( argc, argv, optString );while( opt != -1 ) {switch( opt ) {case 'a':printf("receive a \n");break;case 'b':printf("receive b with argument :%s \n", optarg);break;case 'h':printf("Usage : help \n");break;default:printf("*** can't recognize input char!!! \n");break;}opt = getopt( argc, argv, optString );}return ; }?
getopt只能處理帶一個 ‘-’的選項,如果是含有兩個‘--’則可以使用getopt_long了,
int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);struct option {char *name;int has_arg;int *flag;int val; };name 成員是指向長選項名稱(帶兩個短橫線)的指針。has_arg 成員設(shè)置為 no_argument、optional_argument, 或 required_argument(均在 getopt.h 中定義)之一, 以指示選項是否具有參數(shù)。如果 flag 成員未設(shè)置為 NULL,在處理期間遇到此選項時, 會使用 val 成員的值填充它所指向的 int 值。如果 flag 成員為 NULL,在 getopt_long()遇到此選項時,將返回 val 中的值。?用例:
#include <stdio.h> #include <getopt.h> #include <unistd.h>static const char *optString = "h";static int do_init = 0;/* 收到init參數(shù)會將1的值賦值給do_init,* 收到name或者age返回字符,這里可以返回數(shù)字*/ static const struct option longOpts[] = {{ "init", no_argument, &do_init, 1 },{ "name", required_argument, NULL, 'n' },{ "age", required_argument, NULL, 'a' },{ 0, 0, 0, 0 } };void main(int argc, char **argv) {int longIndex, opt;opt = getopt_long( argc, argv, optString, longOpts, &longIndex );while( opt != -1 ) {switch( opt ) {case 0 :printf("do_init : %d\n", do_init);break;case 'h':printf("Usage : --init --name xx \n");break; case 'n':printf("input name : %s\n", optarg);break; case 'a':printf("input age : %s\n", optarg);break; default:printf("*** fail, unrecognized option ***\n");break;}opt = getopt_long( argc, argv, optString, longOpts, &longIndex );}return ; }?
參考資料:
1.?https://linux.die.net/man/3/getopt
2.?https://www.ibm.com/developerworks/cn/aix/library/au-unix-getopt.html
總結(jié)
以上是生活随笔為你收集整理的c语言命令行选项处理函数getopt和getopt_long() 函数使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcp/ip 协议栈Linux源码分析三
- 下一篇: 年息5%是什么意思 存贷款利息按年利率为