C++程序执行带命令行参数的另一个程序

7

你如何从C++程序执行带参数的命令行程序?这是我在网上找到的:

http://www.cplusplus.com/forum/general/15794/

std::stringstream stream;
stream <<"program.exe "<<cusip;
system(stream.str().c_str());

但似乎它不接受实际的程序位置,所以我不确定如何应用它。我的希望是有类似这样的东西:
std::stringstream stream;
stream <<"C:\Tests\SO Question\bin\Release\HelloWorld.exe "<<"myargument";
system(stream.str().c_str());

这会生成几个与反斜杠相关的警告 - 程序无法工作。它是否期望你将程序放在特定位置?这是我在控制台中得到的输出:
'C:\Tests' 不是内部或外部命令,可执行程序或批处理文件。
附加说明:
因此,根据Jon的答案,对于我来说,正确的版本如下:
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <cstring>
int main(int argc, char *argv[])
{

std::stringstream stream;    
stream << "\"C:\\Tests\\SO Question\\bin\\Release\\HelloWorld.exe\""
       << " " // don't forget a space between the path and the arguments
       << "myargument";
system(stream.str().c_str());

return 0;
}

有没有想过如何将system(...)的标准输出重定向到std::string或std::stringstream? - Pupsik
1
@Pupsik 系统函数返回一个整数。显然,您需要了解您正在使用的操作系统的状态代码:“如果命令不是空指针,则返回的值取决于系统和库实现,但通常预计它是由调用的命令返回的状态代码(如果支持)。”- 来自http://www.cplusplus.com/reference/cstdlib/system/ - 然后您可以根据返回的整数生成适当的错误消息。 - Stepan1010
什么?你看了我的评论吗? - Pupsik
1
@Pupsik 不是的,我在和另一个 Pupsik 说话。Johnny Pupsik,他来自爱尔兰。 - Stepan1010
1
PS:在C++中,实际上有一个“+”运算符用于连接字符串 - 示例v.1:string myString = "something"; myString += "something else";或v.2:直接使用类型转换 string my = (string)"something" + " " +"something else"; 关键是: 您不需要使用另一个库来完成这个操作... - jave.web
1
在这样的程序中,您希望返回HelloWorld.exe的退出值,而不是零。也就是说,将最后两个语句替换为:return system(stream.str().c_str()); - Evgeni Sergeev
2个回答

10
首先,在字面字符串中,每当您希望单个反斜杠出现在实际字符串值中时,应使用两个反斜杠。这是根据语言语法的规定;符合要求的编译器最好只是警告这一点。
无论如何,您遇到的问题是因为在Windows中,包含空格的路径必须用双引号括起来。由于双引号本身需要在C++字符串文字内进行转义,所以您需要编写的内容是:
stream << "\"C:\\Tests\\SO Question\\bin\\Release\\HelloWorld.exe\""
       << " " // don't forget a space between the path and the arguments
       << "myargument";

5

这会给出几个与反斜杠有关的警告。

我认为在C++中\是一个转义字符,使用\\来代替可能会解决这个问题。


1
此外,您的代码将传递字符串“myarguments”,而不是包含此信息的变量,这可能是您想要的。 - Michael Dorgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接