命令列參數解析函數 getopt

來源:互聯網
上載者:User

標籤:

命令列參數解析函數 —— getopt()

getopt()函式宣告如下:
#include <unistd.h>

int getopt(int argc, char * const argv[], const char *optstring);

extern char *optarg;
extern int optind, opterr, optopt;
該函數的argc和argv參數通常直接從main()的參數直接傳遞而來。optstring是選項字母組成的字串。如果該字串裡的任一字元後面有冒號,那麼這個選項就要求有選項參數。當給定getopt()命令參數的數量 (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()對錯誤命令列參數資訊的輸出行為不正確的調用程式在所難免,這種錯誤要麼是命令列選項無效,要麼是缺少選項參數。正常情況下,getopt()會為這兩種情況輸出自己的出錯資訊,並且返回‘?‘。為了驗證此事,可以修改一下上面的清單2中的代碼。清單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()函數的出錯資訊輸出行為:
  1. 在調用getopt()之前,將opterr設定為0,這樣就可以在getopt()函數發現錯誤的時候強制它不輸出任何訊息。
  2. 如果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;
}
測試結果:

$ ./opt_parse_demo -a
無效的選項字元 ‘ a ‘!
$ ./opt_parse_demo -l
缺少選項參數!

命令列參數解析函數 getopt

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.