涉及将向量转换为feed到execvp的错误类型

时间:2016-04-16 21:11:10

标签: c++ vector c-strings execvp

我有一个字符串vector<string> args的向量,我需要将其转换为c字符串,然后通过execvp调用作为参数运行。我一直收到错误&#34;无效转换从const char *到char *为我的循环中的行。我不明白如何解决这个问题,同时仍然可以提供给execvp的东西。虽然我看过类似的帖子,但我遇到的解决方案似乎都无法解决我的问题。

    int argsLen = c->args.size();
    char **argv = new char* [c->args.size() + 1]; 
    for (int index = 0;  index < c->args.size();  ++index)
        argv[index] = c->args[index].c_str();//note that c is the structure in which args is contained
    argv[c->args.size() + 1] = NULL; 

    //execvp(argv[0], argv);

3 个答案:

答案 0 :(得分:2)

如果您想这样做而没有泄漏内存或内存覆盖的可能性,您可以执行以下操作:

typedef std::vector<char> CharArray;
typedef std::vector<CharArray> ArgumentVector;
//...
ArgumentVector argVec;
std::vector<char *>argv;
for (int index = 0;  index < c->args.size();  ++index)
{
   // get the command and create copy
   argVec.push_back(CharArray(c->args[index].begin(), c->args[index].end()));

   // get pointer to newly created entity and place in argv vector 
   argV.push_back(argVec.back().data());
}

// the last argument is NULL
argV.push_back(NULL);

execvp(argV[0], // the first item in the array
       argV.data(), // the char** we are sending

我们所做的只是创建一个std::vector<char*>,我们在这个向量中设置指针的方式是指向另一个向量的数据。填充std::vector<char*>后,char**只是指向第一个项目的指针。

顺便说一句,这是使用vector<char *>而不是vector<string>的正当理由之一。在大多数其他情况下,如果您需要字符串向量,请使用vector<string>

答案 1 :(得分:1)

c_str()返回一个指向其内部缓冲区的const char指针,其内容不允许更改(这就是为什么它的const),显然无法分配给您的char缓冲区。您需要为每个字符串分配内存,然后复制它:

argv[index] = new char[c->args[index].length()];
strcpy(argv[index], c->args[index].c_str());

包括strcpy的cstring标题。

答案 2 :(得分:0)

也许这会有所帮助:

char const **argv = new const char* [c->args.size() + 1];