2011-07-18 25 views
13

我正在嘗試使用getopt_long_only來解析命令行。我的應用程序讀取一些命令行選項。getopt_long_only分段錯誤

E.g. 「app - alpha = 1 - beta = 2 --cecil = 3」

getopt_long_only只要傳入有效的命令行參數就可以正常工作。但是,如果您使用無效的「單一虛線「選項在最後和其他不適當的地方,會發生seg故障。這裏發生了什麼?似乎getopt_long_only不能適應誤輸入的參數。或者我調用的功能錯了?

實施例:下面

> ./app --beta=1 -? 
starting 
index = 1 ret=0 optarg=1 
Segmentation fault 

代碼(C++:app.cc)

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

void ProcessCommandLineArgs(int argc, char** argv) 
{ 

    option longopts[] = { 
     {"alpha", optional_argument, 0, 0}, 
     {"beta", optional_argument, 0, 0}, 
     {"cecil", optional_argument, 0, 0} 
    }; 

    int index; 
    int ret; 
    bool fParseError = false; 

    while (true) 
    { 
     ret = ::getopt_long_only(argc, argv, "", longopts, &index); 

     if (ret < 0) 
     { 
      break; 
     } 

     if ((ret == '?') || (ret == ':')) 
     { 
      fParseError = true; 
      break; 
     } 

     printf("index = %d ret=%d optarg=%s\n", index, ret, optarg?optarg:"<null>"); 
    } 
} 

int main(int argc, char** argv) 
{ 
    printf("starting\n"); 
    ProcessCommandLineArgs(argc, argv); 
    printf("exiting\n"); 
    return 0; 
} 
+1

如果將'int index;'更改爲'int index = 0',它會不會崩潰? – OneOfOne

+0

謝謝1of1。當我這樣做的時候確實停止了崩潰。這是毫無意義的......所以我深入瞭解了手冊頁。這導致我發現我忘記了正確地null結束數組中的最後一行。 – selbie

回答

17

我發現這個問題。

我忘了在我的選擇數組聲明的末尾有一個「零行」。

option longopts[] = { 
    {"alpha", optional_argument, 0, 0}, 
    {"beta", optional_argument, 0, 0}, 
    {"cecil", optional_argument, 0, 0}, 
    {NULL, 0, 0, 0} 
};