C++ C++;当两个不同参数中有空格时,system()不工作

C++ C++;当两个不同参数中有空格时,system()不工作,c++,windows,system,C++,Windows,System,我正在尝试使用system()运行需要一些参数的.exe 如果.exe路径和传入参数的文件路径中有空格,则会出现以下错误: The filename, directory name, or volume label syntax is incorrect. 以下是生成该错误的代码: #include <stdlib.h> #include <conio.h> int main (){ system("\"C:\\Users\\Adam\\Desktop\\pd

我正在尝试使用system()运行需要一些参数的.exe

如果.exe路径和传入参数的文件路径中有空格,则会出现以下错误:

The filename, directory name, or volume label syntax is incorrect.
以下是生成该错误的代码:

#include <stdlib.h>
#include <conio.h>

int main (){
    system("\"C:\\Users\\Adam\\Desktop\\pdftotext\" -layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"");
    _getch();
}
所以我已经在正确的目录中了,但是我不知道如何在同一个system()函数中使用多个命令

有人能告诉我为什么我的命令不起作用,或者我想的第二种方法是否起作用

Edit:看起来我需要一组额外的引号,因为system()将其参数传递给cmd/k,所以它需要在引号中。我在这里找到的:

因此,我将投票以重复方式结束,因为问题非常接近,即使我们没有收到相同的错误消息,谢谢

system()
cmd/C命令的形式运行命令。下面是来自
cmd
doc的引文:

如果指定了/C或/K,则在
开关作为命令行处理,其中包含以下逻辑
用于处理引号(“)字符:
1.如果满足以下所有条件,则引用字符
在命令行上,将保留:
-no/S开关
-正好两个引号字符
-两个引号字符之间没有特殊字符,
其中,special是以下之一:&()@^|
-字符之间有一个或多个空白字符
双引号字符
-两个引号字符之间的字符串是名称
一个可执行文件的名称。
2.否则,旧行为是查看第一个字符是否为
一个引号字符,如果是的话,去掉前导字符并
删除命令行上的最后一个引号字符,保留
最后一个引号字符后的任何文本。
似乎您遇到了案例2,
cmd
认为整个字符串
C:\Users\Adam\Desktop\pdftotext”-layout“C:\Users\Adam\Desktop\week 4.pdf
(即没有第一个和最后一个引号)是可执行文件的名称

因此,解决方案是将整个命令用额外的引号括起来:

//system("\"D:\\test\" nospaces \"text with spaces\"");//gives same error as you're getting
system("\"\"D:\\test\" nospaces \"text with spaces\"\""); //ok, works
这很奇怪。我认为添加
/s
也是一个好主意,只是为了确保它总是按大小写2解析字符串:

system("cmd /S /C \"\"D:\\test\" nospaces \"text with spaces\"\""); //also works

这是一个很好的学习方法。C++调用了TCHARs的字符串。 有一种方法一直对我很有帮助,那就是SetCurrentDirectory()调用。我先设置当前路径,然后执行。到目前为止,这对我很有效。欢迎发表任何评论。
-Sreejith.D.Menon

我来到这里是为了寻找答案,这是我提出的代码(为了下一个维护我的代码的人的利益,我这么明确):

std::stringstream-ss;
std::字符串pathOfCommand;
std::字符串pathOfInputFile;
//一些用于设置路径值的代码

任何认为在文件名中加空格是“一个好主意”的人都应该被枪毙。我想那是微软?当人们的工作在
C:\Documents and Settings
中结束时,很多东西都坏了。我想先调用系统(“cd…”),然后调用系统(“pdftotext…”)会调用两个不同的cmd窗口,而不是在同一个cmd中调用它吗?@smerlin我不知道它在windows上是如何工作的,但在*nix上,情况肯定不是这样,因为system()创建一个新的shell,目录更改不会冒泡。@hamstergene我明白了…您使用的exe是否可以接受同时使用空格的参数?因为这就是我遇到的问题,我刚刚发现了原因(需要另一组“”,因为参数已传递到cmd/k)。谢谢您的回复!@AdamSmith“no/s开关”是案例1适用所必需的(参见文档),因此它强制
cmd
使用旧的行为。没有提到其他效果。感谢您的回答,它工作得很好!在阅读了您发布的文档摘录后,您可能是对的,我可能会更好地使用/S,谢谢!
system("cmd /S /C \"\"D:\\test\" nospaces \"text with spaces\"\""); //also works
std::stringstream ss;
std::string pathOfCommand;
std::string pathOfInputFile;

// some code to set values for paths

ss << "\"";                             // command opening quote
ss << "\"" << pathOfCommand   << "\" "; // Quoted binary (could have spaces)
ss << "\"" << pathOfInputFile << "\"";  // Quoted input (could have spaces)
ss << "\"";                             // command closing quote
system( ss.str().c_str() );             // Execute the command