日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言命令行选项处理函数getopt和getopt_long() 函数使用

發(fā)布時間:2025/4/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言命令行选项处理函数getopt和getopt_long() 函数使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

經(jīng)常接觸Linux的同學應該有這樣的體驗,當遇到一個不會使用的命令時通常敲一下xCmd -h或者xCmd --help來獲取命令提示,例如tcpdump命令或者iptables命令,像這樣的選項僅僅是獲取提示幫助的,實現(xiàn)起來不會很難,但如果考慮到一些復雜的選項,比如說下面這條命令:

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ù)的,一個是用來處理短選項(-開頭)一個長選項(--開頭)功能強大易用,簡單方便,媽媽再也不擔心我寫錯代碼了^_^。

先看下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ù)再次調(diào)用該函數(shù)時,它將返回下一個選項,并設置相應的全局變量。如果不再有識別到的選項,將返回 -1,此任務就完成了。getopt() 所設置的全局變量包括:optarg——指向當前選項參數(shù)(如果有)的指針。 optind——再次調(diào)用 getopt() 時的下一個 argv 指針的索引。 optopt——最后一個已知選項。對于每個選項,選項字符串 (optstring) 中都包含一個對應的字符。具有參數(shù)的選項(如示例中的 -l 和 -o 選項)后面跟有一個 : 字符。可以重復調(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 成員設置為 no_argument、optional_argument, 或 required_argument(均在 getopt.h 中定義)之一, 以指示選項是否具有參數(shù)。如果 flag 成員未設置為 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

總結

以上是生活随笔為你收集整理的c语言命令行选项处理函数getopt和getopt_long() 函数使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。