2011-09-20 40 views
0

我有從我正在寫一個程序解析參數的問題,代碼如下:getopt_long問題

void parse_args(int argc, char** argv) 
{ 
    char ch; 
    int index = 0; 

    struct option options[] = {  
     { "help", no_argument, NULL, 'h' },  
     { "port", required_argument, NULL, 'p' },  
     { "stop", no_argument, NULL, 's' },   
     { 0, 0, 0, 0 }  
    }; 

    while ((ch = getopt_long(argc, argv, "hp:s", options, &index)) != -1) { 
     switch (ch) { 
      case 'h': 
       printf("Option h, or --help.\n"); 
       break; 
      case 's': 
       printf("Option s, or --stop.\n"); 

       break; 
      case 'p': 
       printf("Option p, or --port.\n"); 
       if (optarg != NULL) 
        printf("the port is %s\n", optarg); 
       break; 
      case '?': 
       printf("I don't understand this option!!!\n"); 

      case -1: 
       break; 
      default: 
       printf("Help will be printed very soon -:)\n"); 
     } 
    } 
} 

當我運行我的程序,我得到一些奇怪的輸出:

./Server -p 80 
Option p, or --port. 
the port is 80 

./Server -po 80 
Option p, or --port. 
the port is o 

./Server -por 80 
Option p, or --port. 
the port is or 

./Server -hoho 
Option h, or --help. 
Server: invalid option -- o 
I don't understand this option!!! 
+0

爲什麼它很奇怪?你期望什麼? –

+1

最後三個執行輸出很奇怪!!! – funnyCoder

+1

不,不是。你傳遞'-p',它將下一個事物('o'或'or')解釋爲計數,並忽略'80'。 'p'應該在'o'和'r'之後。在第四輪中,它只計算一次每個字母。 –

回答

7

我認爲這種困惑源於對長時間選擇的誤解。基本上它只會在你使用--表單時纔會進行部分字符串匹配。當您僅使用-時,它將回退到標準解析,因此-por 80-p or 80(如,選項爲-p且參數爲or)相匹配。嘗試與--po--por一樣的事情。至於幫助,請嘗試--he--hel

+0

感謝它更清楚,所以如果我明白處理用戶輸入的唯一安全方式是使用類似strcmp()來驗證用戶字符串? – funnyCoder

+1

@funnyCoder還有另一個調用'getopt_long_only'。檢查出 –

+0

' getopt_long_only'確實是OP想要的,我想... –