日常開發中,會經常對命令行參數進行處理,當參數比較少的時候,可以手動處理,但是當參數過多的時候就要使用getopt來處理了。
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
getopt() 所設置的全局變量包括:
optarg——指向當前選項參數(如果有)的指針。
optind——再次調用 getopt() 時的下一個argv指針的索引,即表示的是下一個將被處理到的參數在argv中的下標值。
optopt——最後一個未知選項。
opterr——如果指定此值爲0,getopt、getopt_long、getopt_long_only遇到錯誤將不會輸出錯誤信息到標準輸出流。
從最簡單的getopt講起,getopt函數的前兩個參數,就是main函數的argc和argv,這兩者直接傳入即可,要考慮的就只剩下第三個參數。
optstring字符串的意義如下:比如:getopt(argc, argv, "ab:c:de::");
1.單個字符,表示選項(如下例中的abcde各爲一個選項)。比如:./a.out -a
2.單個字符後接一個冒號:表示該選項後必須跟一個參數。參數緊跟在選項後或者以空格隔開。該參數的指針賦給optarg(如下例中的b:c:)。比如:./a.out -b zhang
3 單個字符後跟兩個冒號,表示該選項後可以跟一個參數,也可以不跟。如果跟一個參數,參數必須緊跟在選項後不能以空格隔開。該參數的指針賦給optarg。(如上例中的e::,如果沒有跟參數,則optarg = NULL)。./a.out -ezhang
上面這個optstring在傳入之後,getopt函數將依次檢查命令行是否指定了 -a, -b, -c及 -d(這需要多次調用getopt函數,直到其返回-1),當檢查到上面某一個參數被指定時,函數會返回被指定的參數名稱(即該字母)
-mnbn相當於-m -n -b n
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
int main(int argc, char *argv[])
{
int opt;
char *optstring = "ab:c::d:";
// opterr = 0;
while ((opt = getopt(argc, argv, optstring)) != -1)
{
printf("opt = %c\n", opt);
printf("optarg = %s\n", optarg);
printf("optind = %d\n", optind);
printf("argv[optind - 1] = %s\n", argv[optind - 1]);
printf("optopt = %c\n", optopt);
}
return 0;
}
程序運行結果爲: