Как преобразовать массив строк в массив массивов символов? - PullRequest
0 голосов
/ 23 мая 2019

Я хочу передать массив аргументов в функцию exec ().Текущие параметры - это все строки.Как я могу преобразовать массив строк в массив массивов символов?

Прямо сейчас я использую const_cast для удаления const.Код не выглядит красиво.Есть ли лучшее решение?

Пример кода выглядит так:

void f(const string &dev, const string &status){

  char* args[] = {"link", "set", "dev", const_cast<char*>(dev.c_str()), 
  const_cast<char*>(status.c_str())};
  execv("/sbin/ip", args);
}

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вероятно, лучше объявить args как массив char const*:

char const* args[] = {"link", "set", "dev", dev.c_str(), status.c_str()};

Однако, если вам действительно нужен char*, а не char const*, как требует execv, нам нужно std::string::data:

void f(const string &dev_, const string &status_){
  // Note: string literals don't convert to char* in C++,
  // although some compilers allow it as an extension.

  // Declare these as arrays so we can form `char*`s to them:
  char link[] = "link";
  char set[] = "set";
  char dev_lit[] = "dev";

  // No choice but to copy the const args:
  std::string dev{dev_};
  std::string status{status_};

  // C++17-specific:
  char* args[] = {link, set, dev_lit, dev.data(), status.data()};
  execv("/sbin/ip", args);
}

До C ++ 17 вы можете использовать &status[0] вместо status.data(), что правильно, даже если status.size() == 0.

0 голосов
/ 23 мая 2019

Код выглядит не очень красиво. Есть ли лучшее решение?

Для чего стоит, используйте

char* args[] = {"link", "set", "dev", ... };

неправильно начинать с. Строковые литералы могут уменьшаться до char const*, а не char*.

Я предлагаю использовать вспомогательную функцию, которая использует strdup, чтобы дать вам копию входной строки.

char* toArg(std::string const& s)
{
    return strdup(s.c_str());
}

и используйте

char* args[] = {toArg("link"), toArg("set"), toArg("dev"), toArg(dev), toArg(status)};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...