Как правильно вызвать функцию getopt

Ошибки при вызове функции int getopt из 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;
}

person strausionok    schedule 08.05.2012    source источник


Ответы (1)


Здесь вам не хватает двух вещей:

  1. Список аргументов не является строкой. Это список строк. Не запутайтесь в оболочке или других программах, которые запрашивают список аргументов в виде одной строки. В конце концов, эти программы разбивали строку на массивы аргументов и запускали исполняемый файл (см. execv, например).
  2. В списке аргументов всегда есть неявный первый аргумент, который является именем программы.

Вот ваш код, исправлено:

#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';
    }
}
person Community    schedule 08.05.2012
comment
Большое спасибо за решение! Моя проблема в том, что я создаю инструмент командной строки, и в начале вся строка представляет собой строку. Как я мог преобразовать string text="-f input.gmn -output.jpg"; в const char *argv[] = { "ProgramNameHere", "-f", "input.gmn", "-output.jpg" }; - person strausionok; 08.05.2012
comment
@ user1020174: Я рекомендую вам задать отдельный вопрос о том, как разделить строку. - person ; 09.05.2012
comment
О, пожалуйста, просто ответьте, вставив столь необходимый '(char **)' перед аргументом параметра 'argv' в getopt_long(). - person John Greene; 07.04.2017