Using getopt_long (C ++), how do I encode a long & short option so that both require arguments?

#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; } 

Output:

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

Output:

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

Conflict requiring resolution:. Both -s and -s should say: ./a.out: the `-stuff 'parameter requires an argument when used without continuing arguments after the command. But just what? Does anyone know what I'm missing here?

Desired Result:

 ./a.out -s Hello ./a.out: option `--stuff' requires an argument GoodBye! ./a.out --stuff Hello ./a.out: option `--stuff' requires an argument GoodBye! 
+4
source share
2 answers

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

+8
source

I am sure you need to replace "svh" with "s: vh". On the Linux command line for getopt_long, "optstring is a string containing the legitimate option characters. If such a character is followed by a colon, the parameter requires an argument."

+3
source

Source: https://habr.com/ru/post/1390096/


All Articles