_arguments = std::vector<std::string *>();我已经声明了上面的向量,我想将它用于execvp()
int execvp(const char *file, char *const argv[]);如何将类型转换成适合此函数的类型?
应该是这样的
execvp(_arguments[0], _arguments)发布于 2018-09-25 05:22:01
您需要创建指向字符串数据的新的指针数组,而不是指向std::string本身的指针。有很多方法可以做到这一点,但是一种简单的方法是使用另一个std::vector和一个结构化的for循环:
assert(_arguments.size() > 0); // else the executable will be invalid
std::vector<const char *> args;
args.reserve(_arguments.size() + 1);
for(string *sp: _arguments) {
args.push_back(sp->c_str());
}
args.push_back(nullptr); // needed to terminate the args list
execvp(args[0], args.data());发布于 2018-09-25 05:32:21
你不能直接用。您需要将指向每个string内部缓冲区的指针复制到另一个vector中。
假设arguments_是像这样初始化的:
std::vector<std::string*> arguments_ = {
new std::string("mycmd"),
new std::string("arg1"),
new std::string("arg2")
}您可以这样称呼execvp:
// execvp needs a NULL terminator, so make argv one element longer
// than arguments_
std::vector<char*> argv(arguments_.size() + 1);
// copy pointers to each string's buffer into the new vector
std::transform(arguments_.begin(), arguments_.end(), argv.begin(),
[](std::string* arg) {
return arg->data();
});
// The last element of argv was implicitly initialized to a null pointer
// so this isn't actually necessary.
// I just included it to be explicit
argv.back() = nullptr;
// pass a pointer to the array of char*s to execvp
execvp(argv[0], argv.data());请注意,此示例依赖于std::string::data在C++17中添加的非const限定重载。如果您使用的是C++标准的旧版本,则请使用&(*arg)[0]。
发布于 2018-09-25 05:06:14
_arguments = std::vector<std::string *>();标准字符串类将其内部数据管理为char数组。若要访问内部数据,请调用方法data()。返回类型是const char*。
顺便说一句,std::string的指针类型是不必要的。
还请看一下参考资料:http://www.cplusplus.com/reference/string/string/data/
https://stackoverflow.com/questions/52490877
复制相似问题