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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

getopt使用方法

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 getopt使用方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用場(chǎng)景

在Linux中,輸入命令"ls -al",可以顯示指定工作目錄下的內(nèi)容。

-a 顯示所有文件及目錄 (. 開頭的隱藏文件也會(huì)列出)
-l 除文件名稱外,亦將文件型態(tài)、權(quán)限、擁有者、文件大小等資訊詳細(xì)列出

"-al"是選項(xiàng),那這個(gè)選項(xiàng)是怎么被識(shí)別的呢?就和getopt這個(gè)函數(shù)相關(guān)。

getopt可以用來(lái)解析命令的選項(xiàng),以及選項(xiàng)的參數(shù)。"ls -al /home"中"-al"是選項(xiàng),"/home"是參數(shù)。

getopt

#include <getopt.h> // man里說是#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt;

?

參數(shù)

argc? —— 提供給主函數(shù)的參數(shù)個(gè)數(shù)

argv —— 參數(shù)的字符串?dāng)?shù)組的指針

optstring —— 由三部分組成,第一部分是可選的字符’+‘或’-’,第二部分是一個(gè)可選的字符’:’,第三部分是具體的選項(xiàng)字符串。

1. 單個(gè)字符:表示選項(xiàng)后不帶參數(shù)。
2. 單個(gè)字符后接一個(gè)冒號(hào):表示該選項(xiàng)后必須跟一個(gè)參數(shù)參數(shù)緊跟在選項(xiàng)后或者以空格隔開。該參數(shù)的指針賦給optarg。
3.?單個(gè)字符后跟兩個(gè)冒號(hào):表示該選項(xiàng)后可以跟一個(gè)參數(shù)也可以不跟。如果跟一個(gè)參數(shù),參數(shù)必須緊跟在選項(xiàng)后不能以空格隔開。該參數(shù)的指針賦給optarg。如果沒有跟參數(shù),則optarg = NULL。


舉例說明

第三部分 “ab:c::d:e”

abcde 分別是選項(xiàng)字符,選項(xiàng)字符其后跟 “:” 表示該選項(xiàng)有參數(shù),選項(xiàng)跟參數(shù)之間可有空格,也可沒有空格,選項(xiàng)字符后跟 “::” 表示參數(shù)可有可無(wú),但如果有參數(shù)選項(xiàng)和參數(shù)之間不能有空格,選項(xiàng)字符后不跟 “:” 或 “::” 表示該選項(xiàng)沒參數(shù)。"-ae -b100 -c -d 200"就是一個(gè)對(duì)應(yīng)于上述 optstring 的命令選項(xiàng),沒參數(shù)的選項(xiàng)可以寫在一起,比如 -ae。
getopt() 默認(rèn)情況下會(huì)改變參數(shù)的順序,從而使 nonoption argv-element 移至所有選項(xiàng)之后,但如果 optstring 第一部分是字符 ‘+’,或者設(shè)置了環(huán)境變量POSIXLY_CORRECT,第一個(gè) nonoption argv-element 出現(xiàn)時(shí)立即停止選項(xiàng)處理,例如 “+ab:c::d:e”,"-ae 100 -c -d 200" 中 100 及其以后的參數(shù)都不再作為選項(xiàng)處理。
如果第一部分是 ‘-’,每個(gè) nonoption argv-element 作為選項(xiàng) 1 的參數(shù),這里的 1 是數(shù)字 1 不是字符 1。
如果第二部分的 ‘:’ 存在,當(dāng)丟失選項(xiàng)參數(shù)時(shí) getopt() 不再返回 ‘?’ 而是返回 ‘:’,且不會(huì)打印出錯(cuò)信息。
?

返回值

如果選項(xiàng)成功找到,返回選項(xiàng)字符;

如果所有命令行選項(xiàng)都解析完畢,返回 -1;

如果遇到選項(xiàng)字符不在 optstring 中,返回字符 ‘?’,并將 optopt 置為該選項(xiàng)字符;

如果遇到丟失參數(shù),返回 ‘?’ 或 ‘:’,當(dāng)返回返回 ‘?’ 時(shí)且 opterr 非 0 會(huì)提示錯(cuò)誤信息。

?

optarg —— 指向當(dāng)前選項(xiàng)參數(shù)(如果有)的指針或NULL(無(wú)參數(shù))。
optind —— 再次調(diào)用 getopt() 時(shí)下一個(gè) argv-element 的索引。
optopt —— 最后一個(gè)未知選項(xiàng)。
opterr -—— 是否希望 getopt() 向 stderr 打印出錯(cuò)信息,0 為不打印,opterr 默認(rèn)非0。

?

案例

#include <stdio.h> #include <unistd.h>int main(int argc, char *argv[]) {int ch;char *seg1, *seg2, *seg3;//如果 'n' 沒有冒號(hào) ':', 則 optarg 為 (null)//如果 'n' 有冒號(hào) ':', 則 optarg 為 第一個(gè)選項(xiàng)//下面有運(yùn)行結(jié)果while((ch = getopt(argc,argv,"n:"))!= -1){switch(ch){case 'n': //n為name開頭字母seg1=optarg;seg2=argv[optind];seg3=argv[optind+1];printf("option's seg1: +%s\n",seg1);printf("option's seg2: +%s\n",seg2);printf("option's seg3: +%s\n",seg3);break;default:printf("unrecongnized option :%c\n",ch);break;}}return 0; }

輸入命令

./optget_test -n Jack Mike Bob

運(yùn)行結(jié)果('n'有冒號(hào)':')

option's seg1: +Jack option's seg2: +Mike option's seg3: +Bob

運(yùn)行結(jié)果('n'沒有冒號(hào)':')

option's seg1: +(null) option's seg2: +Jack option's seg3: +Mike

?

?

getopt_long

#include <getopt.h> struct option {const char *name;int has_arg;int *flag;int val; }; int getopt_long(int argc, char * const argv[], const char *optstring,const struct option *longopts, int *longindex);

option 的struct成員意義如下:
name:長(zhǎng)選項(xiàng)的名字。
has_arg:no_argument (or 0) 選項(xiàng)沒有參數(shù);required_argument (or 1) 選項(xiàng)有一個(gè)參數(shù)ment; optional_argument (or 2) 選項(xiàng)可有可無(wú)參數(shù)。
flag:標(biāo)識(shí)結(jié)果如何返回。選項(xiàng)如果被找到,如果 flag 是 NULL,getopt_long() 將會(huì)返回 val,否則 getopt_long() 返回 0,而且 *flag 被設(shè)置為 val;選項(xiàng)如果未被找到,getopt_long() 返回 ‘?’,*flag(如果 flag 不為 NULL ) 保持不變。
val:標(biāo)識(shí)返回值。
?

#include <stdio.h> /* for printf */ #include <stdlib.h> /* for exit */ #include <getopt.h> /* for getopt_long_only */static struct option long_options[] = {{"add", required_argument, 0, 'a' },{"sub", required_argument, 0, 's' },{"mul", required_argument, 0, 'm' },{"div", required_argument, 0, 'd' },{"help",no_argument, 0, 'h' },{0, 0, 0, 0 }, };int main(int argc, char **argv) {char ch;int val[2];int res;int option_index = 0;while((ch = getopt_long(argc, argv, "a:s:m:d:h",long_options, &option_index)) != -1){switch(ch){case 'a':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] + val[1];printf("%d + %d = %d\n", val[0], val[1], res);break;case 's':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] - val[1];printf("%d - %d = %d\n", val[0], val[1], res);break;case 'm':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] * val[1];printf("%d * %d = %d\n", val[0], val[1], res);break;case 'd':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] / val[1];printf("%d / %d = %d\n", val[0], val[1], res);break;case 'h':printf("commend list:\n");printf("-add [value1] [value2]: add\n");printf("-sub [value1] [value2]: subtract\n");printf("-mul [value1] [value2]: multiply\n");printf("-div [value1] [value2]: divide\n");printf("-help\n");break;default:break;}}exit(EXIT_SUCCESS); }

?

?

getopt_long_only

#include <getopt.h> struct option {const char *name;int has_arg;int *flag;int val; }; int getopt_long_only(int argc, char * const argv[], const char *optstring,const struct option *longopts, int *longindex);

option 的struct成員意義如下:
name:長(zhǎng)選項(xiàng)的名字。
has_arg:no_argument (or 0) 選項(xiàng)沒有參數(shù);required_argument (or 1) 選項(xiàng)有一個(gè)參數(shù)ment; optional_argument (or 2) 選項(xiàng)可有可無(wú)參數(shù)。
flag:標(biāo)識(shí)結(jié)果如何返回。選項(xiàng)如果被找到,如果 flag 是 NULL,getopt_long() 將會(huì)返回 val,否則 getopt_long() 返回 0,而且 *flag 被設(shè)置為 val;選項(xiàng)如果未被找到,getopt_long() 返回 ‘?’,*flag(如果 flag 不為 NULL ) 保持不變。
val:標(biāo)識(shí)返回值。
?

?

?

案例

#include <stdio.h> /* for printf */ #include <stdlib.h> /* for exit */ #include <getopt.h> /* for getopt_long_only */static struct option long_options[] = {{"add", required_argument, 0, 'a' },{"sub", required_argument, 0, 's' },{"mul", required_argument, 0, 'm' },{"div", required_argument, 0, 'd' },{"help",no_argument, 0, 'h' },{0, 0, 0, 0 }, };int main(int argc, char **argv) {char ch;int val[2];int res;int option_index = 0;while((ch = getopt_long_only(argc, argv, "a:s:m:d:h",long_options, &option_index)) != -1){switch(ch){case 'a':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] + val[1];printf("%d + %d = %d\n", val[0], val[1], res);break;case 's':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] - val[1];printf("%d - %d = %d\n", val[0], val[1], res);break;case 'm':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] * val[1];printf("%d * %d = %d\n", val[0], val[1], res);break;case 'd':sscanf(optarg, "%d", &val[0]);sscanf(argv[optind], "%d", &val[1]);res = val[0] / val[1];printf("%d / %d = %d\n", val[0], val[1], res);break;case 'h':printf("commend list:\n");printf("-add [value1] [value2]: add\n");printf("-sub [value1] [value2]: subtract\n");printf("-mul [value1] [value2]: multiply\n");printf("-div [value1] [value2]: divide\n");printf("-help\n");break;default:break;}}exit(EXIT_SUCCESS); }

?

getopt_long和getopt_long_only區(qū)別

getopt_long 支持的?--add 1 2 \ -a 1 2

getopt_long_only 支持的 -add 1 2 \ --add 1 2 \ -a 1 2 \ --a?1 2

?

?

總結(jié)

以上是生活随笔為你收集整理的getopt使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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