Windows CMD中传递双引号作为命令行参数及argc计数异常问题咨询
Windows CMD中传递双引号作为命令行参数及argc计数异常问题咨询
嗨,我来帮你拆解下这个Windows CMD下的命令行参数困惑~
首先先明确你说的正常情况:当你执行a.exe aa bb < input.txt时,argc是3,这完全符合预期。因为<和input.txt属于Shell层面的重定向操作,是由CMD负责处理的,并不会被作为命令行参数传递给你的程序,所以程序只会收到a.exe、aa、bb这三个参数,argc自然是3。
但你执行a.exe \" bb < input.txt时,argc变成了5,这就和预期不符了,问题出在CMD的引号转义规则上——CMD的转义逻辑和类Unix Shell差异很大:
- 在CMD中,
\并不是引号的转义字符,它就是一个普通的反斜杠字符; - 当你输入
\"时,CMD会把"当作一个未闭合的引号开始,后续的内容解析逻辑会混乱,导致原本应该被Shell处理的重定向符号<和input.txt,都被当成了普通参数传递给了你的程序。
这样一来,你的程序就收到了5个参数:a.exe、\"、bb、<、input.txt,argc自然就变成5了。
那正确的传递方式是什么呢?在CMD中要给程序传递一个单独的双引号作为参数,有两种常用方法:
- 用CMD的转义字符
^来转义双引号:执行a.exe ^" bb < input.txt,此时^"会被CMD解析成一个单独的"作为参数,同时< input.txt依然由Shell处理,不会进入argc,这时候argc就是3,符合你的预期; - 用两个双引号代表一个双引号:执行
a.exe "" bb < input.txt,CMD会自动把""解析成一个单独的"作为参数,同样能达到你想要的效果。
总结一下:核心问题就是CMD的引号解析规则和你默认的认知不同,错误的转义方式导致Shell没能识别重定向符号,进而把它当成参数传递,才造成了argc计数异常。
备注:内容来源于stack exchange,提问作者Doge
相关产品推荐
相关产品推荐

