如何将向量传递给execvp

时间:2011-05-01 06:41:14

标签: c++ vector execvp

我想将一个向量作为第二个参数传递给execvp。有可能吗?

3 个答案:

答案 0 :(得分:7)

是的,通过利用矢量使用的内部数组,它可以非常干净地完成。

这样可行,因为标准保证其元素是连续存储的(参见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;
}

答案 1 :(得分:2)

不直接;你需要以某种方式将向量表示为以字符串形式的NULL终止数组。如果它是一个字符串向量,那么这很容易做到;如果是其他类型的数据,则必须计算如何将其编码为字符串。

答案 2 :(得分:0)

是的,通过利用矢量使用的内部数组,它可以非常干净地完成。

这样可行,因为标准保证其元素是连续存储的(参见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以避免从字符串常量转换为&#39; char *&#39;&#34;。字符串文字实现为&#39; const char *&#39;在C ++中。 const_cast是这里最安全的转换形式,因为它只删除了const而且没有做任何其他有趣的事情。 execvp无论如何都不会编辑这些值。

如果你想避免所有强制转换,你必须通过将所有值复制到&#39; char *&#39;来使这段代码复杂化。类型不值得。