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);
}
啊,謝謝。我需要在星期六晚上停止編碼 – nflacco
哈哈,這也讓我感到很開心。感謝有用的文章 – user87601