我正在为名为fp
的命令编写以下代码,该命令存在于用于处理已经存在的这些命令的框架中。我是C的新手,我正在尝试使用getopt_long()解析这个命令的一些参数。目前,除了打印参数名称和增加变量以查看其中有多少被getopt识别之外,参数不会执行任何操作。以下是相关代码:
//Define options for getopt_long
int opt = 0;
static struct option long_options[] = {
{"watchdog_timer", optional_argument, NULL, 'w'},
{"emergency_hold", optional_argument, NULL, 'e'},
{"braking_wait", optional_argument, NULL, 'r'},
{"pusher_timeout", optional_argument, NULL, 't'},
{"pusher_state_accel_min", optional_argument, NULL, 'a'},
{"pusher_state_min_timer", optional_argument, NULL, 'm'},
{"pusher_distance_min", optional_argument, NULL, 'd'},
{"primary_braking_accel_min", optional_argument, NULL, 'b'},
{NULL, 0, NULL, 0}
};
//Parse arguments
int long_index = 0;
int test = 0;
while ((opt = getopt_long(argc, argv, "wertamdb",
long_options, &long_index )) != -1){
switch (opt){
case 'w':
note("w");
test++;
break;
case 'e':
note("e");
test++;
break;
case 'r':
note("r");
test++;
break;
case 't':
note("t");
test++;
break;
case 'a':
note("a");
test++;
break;
case 'm':
note("m");
test++;
break;
case 'd':
note("d");
test++;
break;
case 'b':
note("b");
test++;
break;
default:
return snprintf(outbuf, outbufc, "Invalid Argument(s)\n");
}
}
return snprintf(outbuf, outbufc, "Args = %d", test);
然后我运行允许我输入此命令的代码,这是我得到的输出(输入以fp
开头的任何行,每隔一行输出一次:
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
[NOTE] 101
[NOTE] e
[NOTE] 114
[NOTE] r
[NOTE] 116
[NOTE] t
[NOTE] 97
[NOTE] a
[NOTE] 109
[NOTE] m
[NOTE] 100
[NOTE] d
[NOTE] 98
[NOTE] b
Args = 7
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
[NOTE] 109
[NOTE] m
[NOTE] 100
[NOTE] d
[NOTE] 98
[NOTE] b
Args = 3
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
[NOTE] 100
[NOTE] d
[NOTE] 98
[NOTE] b
Args = 2
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
[NOTE] 98
[NOTE] b
Args = 1
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
Args = 0
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
Args = 0
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
Args = 0
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
Args = 0
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
Args = 0
fp -w 1 -e 1 -r 1 -t 1 -a 1 -m 1 -d 1 -b 1
Args = 0
出于某种原因,getopt似乎识别出越少和更少的参数,输入命令的次数越多。我还仔细检查以确保所有参数都在argv中出现。知道是什么原因引起的吗?就像我说的那样,我没有和C一起工作过,我希望这很简单,我很想念。
答案 0 :(得分:0)
问题最终是optind
没有在命令调用之间重置。要修复它,我只需在while循环上方添加optind = 0
。