在c ++中将字符串转换为argv

aar*_*acy 8 c++ stdstring argv

我有一个std :: string包含一个用execv执行的命令,什么是最好的"C++"方法将它转换为execv()的第二个参数所需的"char*argv []"?

澄清:

std::string cmd = "mycommand arg1 arg2";
char *cmd_argv[];

StrToArgv(cmd, cmd_argv); // how do I write this function?

execv(cmd_argv[0], cmd_argv);
Run Code Online (Sandbox Code Playgroud)

And*_*oss 10

这里非常非单一的答案.有什么不对:

std::string cmd = "echo hello world";
execl("/bin/sh", "/bin/sh", "-c", cmd.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)

当系统上已有一个非常好的命令行解析器时,为什么还要编写命令行解析器呢?

(注意:一个很好的理由是因为你不相信你将要执行的字符串.人们希望这已经是真的了,但是shell会比那个天真的空白分裂器更多地使用该字符串.如果你不小心,可以打开更多安全漏洞.)


Joh*_*itb 5

std::vector<char *> args;
std::istringstream iss(cmd);

std::string token;
while(iss >> token) {
  char *arg = new char[token.size() + 1];
  copy(token.begin(), token.end(), arg);
  arg[token.size()] = '\0';
  args.push_back(arg);
}
args.push_back(0);

// now exec with &args[0], and then:

for(size_t i = 0; i < args.size(); i++)
  delete[] args[i];
Run Code Online (Sandbox Code Playgroud)

当然,这对使用引用的commans不起作用rm "a file.mp3".您可以考虑关注它的POSIX功能wordexp以及更多功能.