C++ 如何通过cstdlib系统传递带空格的参数

C++ 如何通过cstdlib系统传递带空格的参数,c++,std,C++,Std,我有一个windows控制台应用程序,它接收一个文件,进行一些计算,然后将输出写入指定的文件。输入以“app.exe-input fullfilename”格式指定。我需要从C++程序中调用这个应用程序,但是我对文件路径的空格有问题。当我通过键入直接从cmd.exe调用应用程序时(为了清晰起见,不指定输出文件) 一切正常。但是,当我尝试使用cstdlib std::system()函数时 std::system(" \"c:\\first path\\app.exe\" -input \"c:\

我有一个windows控制台应用程序,它接收一个文件,进行一些计算,然后将输出写入指定的文件。输入以“app.exe-input fullfilename”格式指定。我需要从C++程序中调用这个应用程序,但是我对文件路径的空格有问题。当我通过键入直接从cmd.exe调用应用程序时(为了清晰起见,不指定输出文件)

一切正常。但是,当我尝试使用cstdlib std::system()函数时

std::system(" \"c:\\first path\\app.exe\" -input \"c:\\second path\\input.file\" ");

控制台打印出c:\first不是任何有效的命令。这可能是一个常见的错误,并且有简单的解决方案,但我一直找不到任何解决方案。谢谢您的帮助。

不要试图在std::system()调用中加引号。请尝试以下操作:

std::system("c:\\first\\ path\\app.exe -input c:\\second\\ path\\input.file");
您应该使用Windows API中的_wspawnv函数,而不是std::system()。如果要在路径中搜索程序,而不是指定程序的完整路径,请使用_wspawnvp

#include <stdio.h> #include <wchar.h> ... const WCHAR *app = L"C:\\path to\\first app.exe"; const WCHAR *argv[] = {app, L"-input", L"c:\\second path\\input file.txt"}; _wpspawnv(_P_WAIT, app, argv); #包括 #包括 ... const WCHAR*app=L“C:\\path to\\first app.exe”; 常量WCHAR*argv[]={app,L“-input”,L“c:\\second path\\input file.txt}; _wpv(_P_WAIT,app,argv);
如果您100%确信输入文件名永远不会包含ASCII以外的任何内容,您也可以使用_spawnv/_spawnvp。

您也尝试过转义空格吗?在UNIX系统中,这是shell的责任,应该可以使用。我不确定谁对Windows负有责任,但我敢打赌,无论您使用的是MSVC++还是MinGW或Cygwin,这都会有所不同。您能告诉我们您使用的是什么编译器吗?这似乎可以工作,但不确定为什么:
std::system(“\”\\'c:\\first path\\app.exe\”-input\'c:\\second path\\input.file\”)游吟诗人:它做的完全一样。肯布卢姆:MS VS 2008埃德·纳文教授:是的,这似乎真的很有效,谢谢!但是我也不确定。纳文:在测试了几分钟后,出现了一个不同的问题。虽然您的代码确实有效,但cmd.exe现在会抱怨命令的长度。cmd的“命令名”部分似乎不能超过259个字符,尽管参数允许使用最多8190个字符。外部引号导致命令行作为单个命令处理,没有参数,并且由于指定了文件的完整路径,现在命令长度很容易超过允许的最大259个字符。。
#include <stdio.h>
#include <wchar.h>
...
const WCHAR *app = L"C:\\path to\\first app.exe";
const WCHAR *argv[] = {app, L"-input", L"c:\\second path\\input file.txt"};
_wpspawnv(_P_WAIT, app, argv);