execvp () используя вектор - PullRequest
0 голосов
/ 25 сентября 2018
_arguments = std::vector<std::string *>();

Я объявил вектор выше и хочу использовать его для execvp ()

int execvp(const char *file, char *const argv[]);

Как преобразовать тип для соответствия этой функции?

Должнобыть примерно таким

execvp(_arguments[0], _arguments)

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вам нужно будет создать новый массив указателей на данные строк, а не на сами std::string.Есть много способов сделать это, но один простой способ - использовать другой std::vector и структурированный цикл for:

assert(_arguments.size() > 0);  // else the executable will be invalid

std::vector<const char *> args;
args.reserve(_arguments.size() + 1);
for(string *sp: _arguments) {
  args.push_back(sp->c_str());
}
args.push_back(nullptr);  // needed to terminate the args list

execvp(args[0], args.data());
0 голосов
/ 25 сентября 2018

Вы не можете использовать его напрямую.Вам нужно будет скопировать указатели на каждый внутренний буфер string в другой vector.

Предполагая, что arguments_ инициализируется следующим образом:

std::vector<std::string*> arguments_ = {
    new std::string("mycmd"),
    new std::string("arg1"),
    new std::string("arg2")
}

Вы можете позвонить execvp что-то вроде этого:

// execvp needs a NULL terminator, so make argv one element longer
// than arguments_
std::vector<char*> argv(arguments_.size() + 1);

// copy pointers to each string's buffer into the new vector
std::transform(arguments_.begin(), arguments_.end(), argv.begin(),
               [](std::string* arg) {
                   return arg->data();
               });

// The last element of argv was implicitly initialized to a null pointer
// so this isn't actually necessary.
// I just included it to be explicit
argv.back() = nullptr;

// pass a pointer to the array of char*s to execvp
execvp(argv[0], argv.data());

Обратите внимание, что в этом примере используется неконстантная квалифицированная перегрузка std::string::data, добавленная в C ++ 17.Вместо этого используйте &(*arg)[0], если вы используете более старую версию стандарта C ++.

0 голосов
/ 25 сентября 2018
_arguments = std::vector<std::string *>();

Стандартный строковый класс управляет своими внутренними данными как массив char.Чтобы получить доступ к внутренним данным, вызовите метод data().Тип возвращаемого значения const char*.

Кстати, указатель типа для std::string не является обязательным.

Также посмотрите ссылку: http://www.cplusplus.com/reference/string/string/data/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...