2016-10-20 72 views
1

我在GNU/Linux機器上使用getopt_long。 初始化選項列表如下:如何確定所需的期權參數缺失?

static struct option long_options[] = { 
    {"mode", required_argument, 0, 9}, 
    {0, 0, 0, 0} 
}; 

有代碼

c = getopt_long(argc, argv, "", long_options, index_ptr); 

下面一行當我運行我的程序用命令: '?'

prog --mode 

上面顯示的代碼行返回在C,但不是「:」作爲根據getopt(3)手冊頁預期:「錯誤和-1的回報是一樣 爲getopt的()」

是,使用/解析短選項時,一個可以寫在選項列表類似於「:m:」,因此變量c上缺少的參數將包含':',而不是'?',但是在解析時應該如何區分兩種情況(缺少參數,無效選項)只有長選項?

如何區分無效選項和缺少必需參數的選項?

+0

爲什麼'long_options'陣列中已使用9作爲要返回而不是一個字符「9」,以及爲什麼'optstring/shortopts'參數不含有VAL「9:」 ? (請參閱[解析長選項的示例](https://www.gnu.org/software/libc/manual/html_node/Getopt-Long-Option-Example.html#Getopt-Long-Option-Example)) –

+0

@DavidBowling '.val'是一個'int',但主要在'.flag'指針不爲NULL時使用。因爲'9'不能用於檢測快捷參數,所以最好使用像'm'這樣的字符(用於模式)。 –

+0

是的,我在提問之前閱讀了glibc參考手冊的getopt [_long]部分。但不清楚在這種情況下應該返回什麼。 –

回答

2

,我可以看到完成了無效的選項,並用一個缺少參數的有效選項區分你的目標的唯一方法是將選項結構的has_arg字段設置爲optional_argument,然後手動測試的論據。那麼getopt_long()將只返回'?'的值當出現無效選項時,您可以查看optarg,查看指定選項是否有參數。下面是一個例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 

int main(int argc, char *argv[]) 
{ 
    int i, opt; 
    int index = -1; 

    static struct option long_options[] = { 
     {"mode", optional_argument, NULL, 'm'}, 
     {0, 0, 0, 0} 
    }; 

    /* suppress error messages */ 
    //opterr = 0; 

    while ((opt = getopt_long(argc, argv, "", long_options, &index)) != -1) { 
     if (opt == '?') { 
      /* do something, perhaps: */ 
      //printf("Invalid option \n"); 
      //  exit(EXIT_FAILURE); 
     } 
     if (opt == 'm' && optarg == NULL) { 
      printf("Missing argument in '--mode' option\n"); 
      exit(EXIT_FAILURE); 
     }   
    } 

    return 0; 
} 
+0

我也考慮過這個問題,如果有一個像--mode這樣的選項,那麼if條件的body就會增長。 –

+1

@BulatM .--您是否考慮過使用[Argp](https://www.gnu.org/software/libc/manual/html_node/Argp.html#Argp)?它比'getopt'風格的函數看起來更復雜一些,但它看起來更加靈活。它可能能夠做到你想要的。 –