我有一个简单的C ++程序,列出了它得到的参数:
#include <iostream>
int main(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) {
std::cout << argv[i] << std::endl;
}
return 0;
}
我只是对此进行测试/设计,但最终目的是要接受某些文件和目录的名称。
因此我将这些参数传递给它:
"\\server\directory\file.ext" "C:\trailing\backslash\" "file.txt"
但这是打印的内容:
\\server\directory\file.ext
C:\trailing\backslash" file.txt
即第二个参数后面的斜杠使它认为右引号已转义。
我正在VS2017的属性页中设置参数,但是在以下情况下我会得到相同的输出:
如何让我的程序理解带斜杠的引用路径是一个参数?
编辑 this article的第4节准确描述了我的问题。基本上,我想让我的C ++程序以与批处理文件或VBScript相同的方式解释参数。 我无法更改参数进入程序的方式
编辑,我将简化这个问题:
为了使这种情况发生,我必须对程序或编译器做什么?
答案 0 :(得分:3)
您必须使用另一个反斜杠来保护结尾的反斜杠,否则反斜杠将被视为以下双引号的转义字符。 有关此行为的原理,请参见Raymond Chen的blog post。 这是相关部分的报价:
- 一串不带引号的反斜杠没有特殊含义。
- 偶数个反斜杠后跟一个引号被视为成对的受保护的反斜杠,后跟一个单词终止符。
- 奇数个反斜杠后跟一个引号被视为成对的保护反斜杠,后跟一个受保护的引号。
答案 1 :(得分:1)
我尝试对第二个参数使用额外的斜杠进行编译,如下所示,并且能够产生所需的输出!
"\\server\directory\file.ext" "C:\trailing\backslash\\" "file.txt"
这是输出
/home/a.out
\server\directory\file.ext
C:\trailing\backslash\
file.txt
如果可以帮助我,请评论我的帖子:D
答案 2 :(得分:0)
如果您对命令行解析不满意,可以自己进行:
只需使用GetCommandLine并根据需要解析命令行即可。
其他文章已经描述了/应该如何处理命令行(请参见blog post of Raymond Chen)。