瀏覽量:50次
最近做cache lab 用到了getopt函數(shù), 用man 3 getopt查看了下用法, 做個總結(jié).
描述:getopt函數(shù)是用來解析命令行參數(shù)的, 以‘-’或‘--’開頭的參數(shù)為選項元素,除去‘-’或‘--’的選項元素
為選項字符。如果getopt函數(shù)被重復(fù)調(diào)用,則它將會依次返回每個選項元素中的選項字符。
使用getopt函數(shù)需要包含以下頭文件:
#include
#include
有幾個全局變量與getopt函數(shù)解析參數(shù)有關(guān):
optind: int型, 指示下一個要解析的參數(shù)位置,初始時為1.
optarg: char *, 必須接參數(shù)的選項元素的參數(shù), 如上面的-nxzz, optarg 就指向"xzz"字符串.
opterr: int 型, 設(shè)為0將不打印錯誤信息.
函數(shù)原型為: int getopt(int argc, char * const argv[], const char *optstring);
參數(shù)說明: 前兩個參數(shù)與main函數(shù)參數(shù)相同, argc保存參數(shù)個數(shù),argv[]保存參數(shù)數(shù)組,第三個參數(shù)optstring是你定義
的選項字符組成的字符串, 如"abc",表示該命令有三個選項元素 -a, -b, -c, 選項字符后面如果有一個冒號說
明該選項元素一定有一個參數(shù), 且該參數(shù)保存在optarg中, 如"n:t",
表示選項元素n后要接參數(shù), 選項元素t后
不接參數(shù),如 -n xzz -t 或 -nxzz t,有兩個冒號說明該選項可接可選參數(shù), 但可選參數(shù)不保存在optarg中.
返回值: 如果當前處理的參數(shù)為選項元素,且該選項字符在optstring字符串中, 即為你定義的選項, 則返回該
選項字符,如果該選項字符不是你定義的, 那么返回字符'?', 并更新全局變量optind, 指向argc數(shù)組中的下一
個參數(shù). 如果當前處理的參數(shù)不是選項元素, 則optind偏移向下一個參數(shù), 直到找到第一個選項元素為止, 然后
再按之前描述的操作,如果找不到選項元素, 說明解析結(jié)束, 則返回-1.
下面看例子:
#include
#include
int main(int argc, char * const argv[])
{
int opt;
while ((opt = getopt(argc, argv, "nb:o::t")) != -1) {
printf("opt = %c, optarg = %s, optind = %d, argv[%d] = %sn",
opt, optarg, optind, optind, argv[optind]);
}
return 0;
}
假設(shè)編譯好的可執(zhí)行文件名為test, test有3個有效參數(shù)-n, -b, -t, 其中-n, -t后不接參數(shù), -b后一定要接參數(shù), -o后接可選參數(shù).
# ./test -x -y -z <------ 無效參數(shù), 會打印錯誤信息, 并返回字符'?'
輸出:
./getopt: invalid option -- 'x'
opt = ?, optarg = (null), optind = 2, argv[2] = -y
./getopt: invalid option -- 'y'
opt = ?, optarg = (null), optind = 3, argv[3] = -z
./getopt: invalid option -- 'z'
opt = ?, optarg = (null), optind = 4, argv[4] = (null)
# ./test -n -b xzz -t
opt = n, optarg = (null), optind = 2, argv[2] = -b
opt = b, optarg = xzz, optind = 4, argv[4] = -t <----------- optarg 指向選項元素的參數(shù), 并且optind跳過了該參數(shù), 直接指向了-t參數(shù)
opt = t, optarg = (null), optind = 5, argv[5] = (null)
# ./test -n -bxzz -t <------------- 也可將選項參數(shù)與其接的參數(shù)寫在一起
opt = n, optarg = (null), optind = 2, argv[2] = -bxzz
opt = b, optarg = xzz, optind = 3, argv[3] = -t <----------- optind 同樣將指向下一個參數(shù)-t
opt = t, optarg = (null), optind = 4, argv[4] = (null)
# ./test -b -t
opt = b, optarg = -t, optind = 3, argv[3] = (null) <----------- 將-t當成了選項元素-b的參數(shù), 之后就不再解析-t, optind為3
# ./test -t -b <---- -b缺少參數(shù)
opt = t, optarg = (null), optind = 2, argv[2] = -b
./getopt: option requires an argument -- 'b'
opt = ?, optarg = (null), optind = 3, argv[3] = (null)
# ./test -t a -b xzz <------- 命令行中有一個無用參數(shù) a, 解析時被忽略了, 因為-t不需要接參數(shù)
opt = t, optarg = (null), optind = 2, argv[2] = a
opt = b, optarg = xzz, optind = 5, argv[5] = (null)
# ./test -ntb xzz <--------- 還可以把參數(shù)連在一起寫
opt = n, optarg = (null), optind = 1, argv[1] = -ntb
opt = t, optarg = (null), optind = 1, argv[1] = -ntb
opt = b, optarg = xzz, optind = 3, argv[3] = (null)
# ./test -t -o -b xzz <----- -o選項不接參數(shù)
opt = t, optarg = (null), optind = 2, argv[2] = -o
opt = o, optarg = (null), optind = 3, argv[3] = -b
opt = b, optarg = xzz, optind = 5, argv[5] = (null)
# ./test -t -o 10 -b xzz <------ -o選項接參數(shù)10
opt = t, optarg = (null), optind = 2, argv[2] = -o
opt = o, optarg = (null), optind = 3, argv[3] = 10 <------------------ 可以看到10并沒有保存在optarg中
opt = b, optarg = xzz, optind = 6, argv[6] = (null) <----------------- 而-b的參數(shù)則保存在optarg中了
常用用法:
一般是用while循環(huán)配合switch語句來使用getopt函數(shù)解析參數(shù), 如下:
/*
* 得到參數(shù)信息
*/
int getinfo(int argc, char * const argv[], int *ps, int *pE, int *pb, char *trace_name, int *vflag)
{
int opt;
int count_arg = 0;
opterr = 0;
while ((opt = getopt(argc, argv, "vs:E:b:t:")) != -1) {
switch (opt) {
case 'v':
*vflag = 1;
break;
case 's':
++count_arg;
*ps = atoi(optarg);
break;
case 'E':
++count_arg;
*pE = atoi(optarg);
break;
case 'b':
++count_arg;
*pb = atoi(optarg);
break;
case 't':
++count_arg;
strcpy(trace_name, optarg);
break;
default: /* '?' */
Usage();
exit(-1);
break;
}
}
if (count_arg < 4) {
Usage();
exit(-1);
}
return 0;
}
[聲明]本網(wǎng)轉(zhuǎn)載網(wǎng)絡(luò)媒體稿件是為了傳播更多的信息,此類稿件不代表本網(wǎng)觀點,本網(wǎng)不承擔此類稿件侵權(quán)行為的連帶責(zé)任。故此,如果您發(fā)現(xiàn)本網(wǎng)站的內(nèi)容侵犯了您的版權(quán),請您的相關(guān)內(nèi)容發(fā)至此郵箱【779898168@qq.com】,我們在確認后,會立即刪除,保證您的版權(quán)。
官網(wǎng)優(yōu)化
整站優(yōu)化
渠道代理
400-655-5776