如何将字符串数组转换为char数组数组

How to convert from a string array to a char array array?

本文关键字:数组 转换 char 字符串      更新时间:2023-10-16

我想将一个参数数组传递给exec((函数。当前参数都是字符串。如何将字符串数组转换为char数组的数组?

现在,我正在使用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);
}

最好将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

也是正确的

代码看起来不好。有更好的解决方案吗?

对于它的价值,使用

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)};