首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vector<string *>的execvp()

使用vector<string *>的execvp()
EN

Stack Overflow用户
提问于 2018-09-25 05:00:41
回答 3查看 1.3K关注 0票数 1
代码语言:javascript
复制
_arguments = std::vector<std::string *>();

我已经声明了上面的向量,我想将它用于execvp()

代码语言:javascript
复制
int execvp(const char *file, char *const argv[]);

如何将类型转换成适合此函数的类型?

应该是这样的

代码语言:javascript
复制
execvp(_arguments[0], _arguments)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-25 05:22:01

您需要创建指向字符串数据的新的指针数组,而不是指向std::string本身的指针。有很多方法可以做到这一点,但是一种简单的方法是使用另一个std::vector和一个结构化的for循环:

代码语言:javascript
复制
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());
票数 2
EN

Stack Overflow用户

发布于 2018-09-25 05:32:21

你不能直接用。您需要将指向每个string内部缓冲区的指针复制到另一个vector中。

假设arguments_是像这样初始化的:

代码语言:javascript
复制
std::vector<std::string*> arguments_ = {
    new std::string("mycmd"),
    new std::string("arg1"),
    new std::string("arg2")
}

您可以这样称呼execvp

代码语言:javascript
复制
// 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]

票数 2
EN

Stack Overflow用户

发布于 2018-09-25 05:06:14

代码语言:javascript
复制
_arguments = std::vector<std::string *>();

标准字符串类将其内部数据管理为char数组。若要访问内部数据,请调用方法data()。返回类型是const char*

顺便说一句,std::string的指针类型是不必要的。

还请看一下参考资料:http://www.cplusplus.com/reference/string/string/data/

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52490877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档