2013-01-13 61 views
1

我正在嘗試使用getopt_long解析一些基本選項。我的具體問題是當不使用該選項時,將覆蓋默認的int值。我已經閱讀了docs和getopt的一些解釋,但沒有看到任何關於保留默認值/可選參數的內容。getopt_long保留可選arg的默認值

編譯並運行它,我期望port/p爲4567的默認值。當我沒有指定選項或者使用-p 5050時,事情就會起作用。當我使用其他選項(-t)時,-p的值也會改變。

gcc -o tun2udp_dtls tun2udp_dtls.c 
$ /tun2udp_dtls 
port 4567 // correct 
$ /tun2udp_dtls -p 5050 
port 5050 // correct 
$ ./tun2udp_dtls -t foo 
port 0 // wtf!? 

代碼:

#include <errno.h> 
#include <fcntl.h> 
#include <netinet/in.h> 
#include <sys/ioctl.h> 
#include <sys/select.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <string.h> 
#include <unistd.h> 
#include <getopt.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) { 
    // Vars 
    char devname[128]; 
    int port = 4567; 

    int c; 
    while (1) { 
     static struct option long_options[] = { 
      {"tdev", required_argument, NULL, 't'}, 
      {"port", required_argument, NULL, 'p'}, 
      {0, 0, 0, 0} 
     }; 
     int option_index = 0; 
     c = getopt_long (argc, argv, "t:p:", long_options, &option_index); 

     if (c == -1) break; 
     switch (c) { 
      case 't': 
       strncpy(devname, optarg, sizeof(devname)); 
       devname[sizeof(devname)-1] = 0; 
      case 'p': 
       port = atoi(optarg); 
      default: 
       break; 
     } 
    } 

    // Temporary debug printout 
    printf("tdev '%s'\n", devname); 
    printf("port %i\n", port); 
} 

回答

0

缺少breakcase 'p':之前。這就是爲什麼當處理「t」時控制達到port=atoi(optarg);;那麼atoi(optarg)會將非數字設備名稱返回0,並將此0分配給端口。

+0

啊,謝謝。我需要在星期六晚上停止編碼 – nflacco

+0

哈哈,這也讓我感到很開心。感謝有用的文章 – user87601