C:仅使用getopt_long作为标志,没有开关。程序只能看到第一个标志

时间:2017-01-30 00:11:13

标签: c

我很抱歉此事已被问过。我环顾四周,但找不到与此特定情况相关的帖子

现在,我正在实现两个标志, - save和--load。最终,他们将为一个流氓手段处理保存和加载地下城文件,但是现在我只想让他们做一些事情。这是我的代码的相关部分,来自main。

static struct option long_options[] = {
  {"load", no_argument, &load_flag, 1},
  {"save", no_argument, &save_flag, 1},
  {0,0,0,0},
};
while((c = getopt_long(argc, argv, "f", long_options, NULL)) != -1) {
    break;
}
if(load_flag == 1) {
     printf("hey, the load flag works \n");
}
if(save_flag == 1) {
     printf("And the save flag works as well! \n");
}

根据我的理解,来自while语句的条件实际应该设置标志。但是,code i adapted it from还包含一个具有必需元素的选项,因此它有一个switch语句和一个optstring参数。我试图修改代码以适应我的情况,但在翻译中丢失了一些东西。我还必须在getopt_long中保留optstring参数,即使它在我的代码中没有做任何事情。

当我运行修改后的代码时, - 或者 - 或 - 运行,但如果我同时使用它们,它只会注册输入的第一个。不幸的是,我的规格说两者都可以同时使用,所以我们就是这样。

我的问题如下。

  1. 为什么只分配第一个标志,我需要做些什么来解决它?

  2. 是否与离开optstring参数有关" f"在getopt_long中满足编译器?这是错误的做法吗?

1 个答案:

答案 0 :(得分:1)

break在第一次迭代后停止while循环,因此它只检查第一个选项。我猜你最初在那里有一个switch语句,因此break用于退出switch并继续while循环。由于您没有switch,因此应该使用空的while循环。

其他问题:

  • 如果您不希望接受"f"选项,则不应传递-f
  • 您可能还想检查'?'返回值,该值表示何时使用了未知选项。