Как передать вектор в execvp - PullRequest
2 голосов
/ 01 мая 2011

Я хочу передать вектор в качестве второго аргумента execvp. Возможно ли это?

Ответы [ 3 ]

7 голосов
/ 17 апреля 2012

Да, это можно сделать довольно чисто, используя преимущества внутреннего массива, который используют векторы.

Это будет работать, поскольку стандарт гарантирует, что его элементы хранятся непрерывно (см. https://stackoverflow.com/a/2923290/383983)

#include <vector>

using namespace std;

int main(void) {
  vector<char *> commandVector;

  // do a push_back for the command, then each of the arguments
  commandVector.push_back("echo");
  commandVector.push_back("testing");
  commandVector.push_back("1");
  commandVector.push_back("2");
  commandVector.push_back("3");  

  // push NULL to the end of the vector (execvp expects NULL as last element)
  commandVector.push_back(NULL);

  // pass the vector's internal array to execvp
  char **command = &commandVector[0];

  int status = execvp(command[0], command);
  return 0;
}
2 голосов
/ 01 мая 2011

не напрямую;вам нужно как-то представить вектор как массив строковых указателей с нулевым символом в конце.Если это вектор строк, это легко сделать;если это какой-то другой тип данных, вам придется выяснить, как его кодировать в виде строк.

0 голосов
/ 08 декабря 2017

Да, это можно сделать довольно чисто, используя преимущества внутреннего массива, который используют векторы.

Это будет работать, поскольку стандарт гарантирует, что его элементы хранятся непрерывно (см. https://stackoverflow.com/a/2923290/383983)

#include <vector>

using std::vector;

int main() {
  vector<char*> commandVector;

  // do a push_back for the command, then each of the arguments
  commandVector.push_back(const_cast<char*>("echo"));
  commandVector.push_back(const_cast<char*>("testing"));
  commandVector.push_back(const_cast<char*>("1"));
  commandVector.push_back(const_cast<char*>("2"));
  commandVector.push_back(const_cast<char*>("3"));

  // push NULL to the end of the vector (execvp expects NULL as last element)
  commandVector.push_back(NULL);

  int status = execvp(command[0], &command[0]);
  return 0;
}

Выполните const_cast, чтобы избежать "устаревшего преобразования из строковой константы в 'char *'". Строковые литералы реализованы как "const char *" в C ++. Const_cast является самой безопасной формой приведения здесь, поскольку она только удаляетconst и не делает никаких других забавных дел. execvp не будет редактировать значения в любом случае.

Если вы хотите избежать всех приведений, вам придется усложнить этот код, скопировав все значения в типы 'char *'не очень стоит.

...