涉及将要馈送的向量转换为execvp的错误类型

Wrong types involving converting a vector to feed to execvp

本文关键字:转换 execvp 错误 类型 向量      更新时间:2023-10-16

我有一个字符串向量vector<string> args,我需要将其转换为c字符串,然后通过execvp调用作为参数运行。我一直收到错误"从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);

如果您想在不泄露内存或内存覆盖的情况下完成此操作,可以执行以下操作:

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>

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

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

包括strcpy的CCD_ 9报头。

也许这会有所帮助:

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