C - getopt_long没有解析所有参数?

时间:2017-11-09 21:23:14

标签: c getopt getopt-long

我正在为名为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一起工作过,我希望这很简单,我很想念。

1 个答案:

答案 0 :(得分:0)

问题最终是optind没有在命令调用之间重置。要修复它,我只需在while循环上方添加optind = 0