2014-10-03 64 views
0

我該如何處理用戶在參數的長版本之前只輸入一個破折號的情況?使用getopt_long處理用戶錯誤

例如,運行我的程序與-copy

 
$ my_program -copy 
Copy 
Open 
my_program: invalid option -- p 
Unknown 

它是在執行o選項的問題。我的目標是顯示一個錯誤報告,這是一種心態,「你在一個短劃線之後鍵入了多個字符」。

代碼

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

int main(int argc, char *argv[]) 
{ 
    struct option options[] = 
    { 
    {"open", no_argument, 0, 'o'}, 
    {"copy", no_argument, 0, 'c'}, 
    {0, 0, 0, 0} 
    }; 

    int c; 
    int option_index = 0; 
    while ((c = getopt_long(argc, argv, "oc", options, &option_index)) != -1) 
    { 
    switch (c) 
    { 
    case 'o': 
     printf("Open\n"); 
     break; 
    case 'c': 
     printf("Copy\n"); 
     break; 
    default: 
     printf("Unknown\n"); 
     return 0; 
    } 
    } 

    return 0; 
} 
+0

如果您不希望單個字母的選項不明確,不指定它們。或者等到您執行任何操作之前解析了所有選項。 – 2014-10-03 04:22:29

回答

2

沒有辦法比手動解析命令行來做到這一點其他的。 getopt_long()的工作原理是長選項以--開頭,如果您不想要--,則不會嘗試輸入長選項。在任何情況下,用戶是否確實忘記了-,或者用戶是否真的認爲有短期選項,並且程序沒有辦法區分這兩種情況,那麼最好不過是含糊不清。

你可以做些什麼,但如果需要的話,可以用getopt_long()代替getopt_long_only(),它允許用一個單獨的-指定長選項。在您的特定情況下,-copy將被接受爲--copy的替代選項,因此您不需要報告錯誤。顯然你會增加這種模糊匹配的可能性。

修訂代碼:

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

int main(int argc, char *argv[]) { 
    struct option options[] = { 
     {"open", no_argument, 0, 'o'}, 
     {"copy", no_argument, 0, 'c'}, 
     {0, 0, 0, 0} 
    }; 

    int c; 
    int option_index = 0; 
    while ((c = getopt_long_only(argc, argv, "oc", 
           options, &option_index)) != -1) { 
     switch (c) { 
     case 'o': 
      printf("Open\n"); 
      break; 
     case 'c': 
      printf("Copy\n"); 
      break; 
     default: 
      printf("Unknown\n"); 
      return 0; 
     } 
    } 

    return 0; 
} 

輸出:

[email protected]:~/src/sandbox$ ./go -copy 
Copy 
[email protected]:~/src/sandbox$