如何正确调用getopt函数

时间:2012-05-08 16:25:20

标签: c++ argv getopt

http://code.google.com/p/darungrim/source/browse/trunk/ExtLib/XGetopt.cpp?r=17

调用int getopt函数时出错
`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;
}

1 个答案:

答案 0 :(得分:7)

你在这里遗漏了两件事:

  1. 参数列表不是字符串。这是一个字符串列表。不要被shell或其他程序混淆,这些程序要求将参数列表作为单个字符串。在一天结束时,这些程序会将字符串拆分为参数数组并运行可执行文件(例如,请参阅execv)。
  2. 参数列表中始终存在隐含的第一个参数,即程序名称。
  3. 以下是您修改的代码:

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