How to call correctly getopt function
argv, c++, getopt
Solution
You are missing two things here:
- Argument list is not a string. It is a list of strings. Don't get confused by shell or other programs that ask for a list of arguments as a single string. At the end of day, those programs would split a string into arrays of arguments and run an executable (see execv, for example).
- There is always an implicit first argument in argument list that is a program name.
Here is your code, fixed:
#include <string>
#include <iostream>
#include <unistd.h>
int main()
{
const char *argv[] = { "ProgramNameHere",
"-f", "input.gmn", "-output.jpg" };
int argc = sizeof(argv) / sizeof(argv[0]);
std::cout << "argc: " << argc << std::endl;
for (int i = 0; i < argc; ++i)
std::cout << "argv: "<< argv[i] << std::endl;
int c;
while ((c = getopt(argc, (char **)argv, "f:s:o:pw:h:z:t:d:a:b:?")) != -1) {
std::cout << "Option: " << (char)c;
if (optarg)
std::cout << ", argument: " << optarg;
std::cout << '\n';
}
}
Problem
Errors while calling int getopt function from http://code.google.com/p/darungrim/source/browse/trunk/ExtLib/XGetopt.cpp?r=17 ``` `check.cpp: In function ‘int main()’:` ``` `check.cpp:14:55: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive]` `/usr/include/getopt.h:152:12: error: initializing argument 2 of ‘int getopt(int, char* const*, const char*)’ [-fpermissive]` ``` #include <iostream> #include <cstring> #include <string> #ifdef USE_UNISTD #include <unistd.h> #else #include "XGetopt.h" #endif using namespace std; int main() { string text="-f input.gmn -output.jpg"; int argc=text.length(); cout<<"argc: "<<argc<<endl; char const * argv = text.c_str(); cout<<"argv: "<<argv<<endl; int c = getopt (argc, &argv, "f:s:o:pw:h:z:t:d:a:b:?"); cout<<"c: "<<c<<endl; return 0; } ```