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会比那个天真的空白分裂器更多地使用该字符串.如果你不小心,可以打开更多安全漏洞.)
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以及更多功能.