将向量<string>转换为字符**以在执行中使用



我有一个名为tokens的向量,它将命令保存在token[0]和args中,作为向量的其余部分。我正在尝试转换矢量,以便可以调用execvp(args[0], args);。当前args[0]和args仅打印为内存地址。

char **args = (char**)malloc(tokens.size() * sizeof(string));
char *arg;
int i;
for(i = 0; i < tokens.size(); i++)
{
arg = &tokens[i][0];
args[i] = arg;
}

您不必求助于malloc来执行此操作,因为您已经在使用字符串的向量。

您可以在调用execvp:之前创建一个std::vector<char*>

std::vector<char*> pvec(tokens.size());
std::transform(tokens.begin(), tokens.end(), pvec.begin(), [](auto& str) {
return &str[0];
});
pvec.data(); // This is a char**, pass it to `execvp`

我发现答案在于在向量的末尾添加NULL终止符,这样execvp就知道在哪里结束pvec.data((;这要感谢上面的法提赫。

std::vector<char*> pvec(tokens.size());
std::transform(tokens.begin(), tokens.end(), pvec.begin(), [](auto& str) {
return &str[0];
});
pvec.push_back(NULL);
pvec.data();
pid = fork();
// if we enter child process
if (pid == 0)
{
if (execvp(pvec.data()[0], pvec.data()) == -1)
{
printf("right here officern");
}
exit(EXIT_FAILURE);
}```

相关内容

最新更新