我有一个字符串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);
答案 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];