#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; |
argc
)、指向這些參數的數組 (argv
) 和選項字串 (optstring
)
後,getopt()
將返回第一個選項,並設置一些全局變量。使用相同的參數再次調用該函數時,它將返回下一個選項,並設置相應的全局變量。如果不再有可識別的選項,將返回 -1
,此任務就完成了。getopt()
所設置的全局變量包括:char *optarg
——當前選項參數字串(如果有)。int optind
——argv的當前索引值。當getopt()在while循環中使用時,循環結束後,剩下的字串視爲操作數,在argv[optind]至argv[argc-1]中可以找到。- int opterr——這個變量非零時,getopt()函數爲“無效選項”和“缺少參數選項,並輸出其錯誤信息。
int optopt
——當發現無效選項字符之時,getopt()函數或返回'?'字符,或返回':'字符,並且optopt包含了所發現的無效選項字符。
選項:
- -n —— 顯示“我的名字”。
- -g —— 顯示“我女朋友的名字”。
- -l —— 帶參數的選項.
清單2:
#include <stdio.h> #include <unistd.h> int main (int argc, char **argv) { int oc; /*選項字符 */ char *b_opt_arg; /*選項參數字串 */ while((oc = getopt(argc, argv, "ngl:")) != -1) { switch(oc) { case 'n': printf("My name is Lyong.\n"); break; case 'g': printf("Her name is Xxiong.\n"); break; case 'l': b_opt_arg = optarg; printf("Our love is %s\n", optarg); break; } } return 0; } |
$ ./opt_parse_demo -n My name is Lyong. $ ./opt_parse_demo -g Her name is Xxiong. $ ./opt_parse_demo -l forever Our love is forever $ ./opt_parse_demo -ngl forever My name is Lyong. Her name is Xxiong. Our love is forever |
6、改變getopt()對錯誤命令行參數信息的輸出行爲
清單3:
#include <stdio.h> #include <unistd.h> int main (int argc, char **argv) { int oc; /*選項字符 */ char *b_opt_arg; /*選項參數字串 */ while((oc = getopt(argc, argv, "ngl:")) != -1) { switch(oc) { case 'n': printf("My name is Lyong.\n"); break; case 'g': printf("Her name is Xxiong.\n"); break; case 'l': b_opt_arg = optarg; printf("Our love is %s\n", optarg); break; case '?': printf("arguments error!\n"); break; } } return 0; } |
$ ./opt_parse_demo -l ./opt_parse_demo: option requires an argument -- l arguments error! |
- 在調用getopt()之前,將opterr設置爲0,這樣就可以在getopt()函數發現錯誤的時候強制它不輸出任何消息。
- 如果optstring參數的第一個字符是冒號,那麼getopt()函數就會保持沉默,並根據錯誤情況返回不同字符,如下:
- “無效選項” —— getopt()返回'?',並且optopt包含了無效選項字符(這是正常的行爲)。
- “缺少選項參數” —— getopt()返回':',如果optstring的第一個字符不是冒號,那麼getopt()返回'?',這會使得這種情況不能與無效選項的情況區分開。
清單4:
#include <stdio.h> #include <unistd.h> int main (int argc, char **argv) { int oc; /*選項字符 */ char ec; /*無效的選項字符*/ char *b_opt_arg; /*選項參數字串 */ while((oc = getopt(argc, argv, ":ngl:")) != -1) { switch(oc) { case 'n': printf("My name is Lyong.\n"); break; case 'g': printf("Her name is Xxiong.\n"); break; case 'l': b_opt_arg = optarg; printf("Our love is %s\n", optarg); break; case '?': ec = (char)optopt; printf("無效的選項字符 \' %c \'!\n", ec); break; case ':': printf("缺少選項參數!\n"); break; } } return 0; } |
無效的選項字符 ' a '!
$ ./opt_parse_demo -l
缺少選項參數!
參見http://blog.csdn.net/mr_jj_lian/article/details/6835137