使用getopt_long(C++)如何编写长短选项以都需要参数?


#include <iostream>
#include <getopt.h>
#define no_argument 0
#define required_argument 1 
#define optional_argument 2

int main(int argc, char * argv[])
{
  std::cout << "Hello" << std::endl;
  const struct option longopts[] =
  {
    {"version",   no_argument,        0, 'v'},
    {"help",      no_argument,        0, 'h'},
    {"stuff",     required_argument,  0, 's'},
    {0,0,0,0},
  };
  int index;
  int iarg=0;
  //turn off getopt error message
  opterr=1; 
  while(iarg != -1)
  {
    iarg = getopt_long(argc, argv, "svh", longopts, &index);
    switch (iarg)
    {
      case 'h':
        std::cout << "You hit help" << std::endl;
        break;
      case 'v':
        std::cout << "You hit version" << std::endl;
        break;
      case 's':
        std::cout << "You hit stuff" << std::endl;
        break;
    }
  }
  std::cout << "GoodBye!" << std::endl;
  return 0; 
}

输出:

./a.out -s
Hello
You hit stuff
GoodBye!

输出:

./a.out --stuff
Hello
./a.out: option `--stuff' requires an argument
GoodBye!

需要解决的冲突:-s 和 --s 都应该说:./a.out:选项 '--stuff' 在使用时需要一个参数,而无需在命令后面继续参数。但只有--东西呢?有谁知道我在这里错过了什么?

期望的结果:

./a.out -s
     Hello
     ./a.out: option `--stuff' requires an argument
      GoodBye!
./a.out --stuff
     Hello
     ./a.out: option `--stuff' requires an argument
     GoodBye!

您的getopt_long调用为短选项指定"svh",而它应该说"s:vh"。 冒号告诉getopt需要"s"的参数。

我很确定你需要用"s:vh"替换"svh"。 根据 Linux 手册页的getopt_long"optstring 是包含合法选项字符的字符串。如果此类字符后跟冒号,则该选项需要一个参数,"。

最新更新