#include <iostream>#include <getopt.h>#define no_argument 0#define required_argument 1 #define optional_argument 2int 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 messageopterr=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; }

Output:

./a.out -sHelloYou hit stuffGoodBye!

Output:

./a.out --stuffHello./a.out: option `--stuff' requires an argumentGoodBye!

Conflict needing resolved: Both -s & --s should say: ./a.out: option `--stuff' requires an argument when used without proceeding arguments following the command. But only --stuff does? Does anyone know what I'm missing here?

Desired result:

./a.out -sHello./a.out: option `--stuff' requires an argumentGoodBye!./a.out --stuffHello./a.out: option `--stuff' requires an argumentGoodBye!
2

Best Answer


Your getopt_long call specifies "svh" for the short options when it should say "s:vh". The colon tells getopt to require an argument for "s".

I'm pretty sure you need to replace "svh" with "s:vh". Per the Linux man page for getopt_long "optstring is a string containing the legitimate option characters. If such a character is followed by a colon, the option requires an argument,".