Main函数中的argc参数不包括重定向命令(‘<;’,‘>;’).
但是,我遇到了一个使用双引号的令人困惑的问题.
shell(CMD)个
- 我预计ARGC是
3
,而且是的!
a.exe aa bb < input.txt
- 我预计argc也是
3
,但实际上是5
,我只想输入double quote
作为参数.
a.exe \" bb < input.txt
我的系统
操作系统:windows 11,shell:windows CMD
Main函数中的argc参数不包括重定向命令(‘<;’,‘>;’).
但是,我遇到了一个使用双引号的令人困惑的问题.
shell(CMD)个
3
,而且是的!a.exe aa bb < input.txt
3
,但实际上是5
,我只想输入double quote
作为参数.a.exe \" bb < input.txt
我的系统
操作系统:windows 11,shell:windows CMD
在类似于Unix的Linux系统中,引号被很好地定义:您可以在单引号或双引号中包含文本(参数内插的行为不同),其后面的字符无条件地包含反斜杠quotes.此外,所有这些引号都会被shell 很好地接受,并且您的程序会收到预期的不带引号的字符串.
不幸的是,Windows shell(cmd.exe
)并不那么友好.没有重定向的整个命令行被传递给程序,C运行时库处理引用规则.这些规则在Microsoft documentation中描述,正如预期的那样,\"
作为单个字符串参数传递.
不幸的是,同一页上写着:
用双引号括起来的字符串被解释为单参数,...如果命令行在找到右双引号之前结束,则到目前为止读取的所有字符都将作为最后一个参数输出.
我怀疑这就是这里发生的事情:shell (cmd.exe
)看到奇数个双引号,并且不处理任何重定向.然后,它将整个命令行including the redirection传递给程序,并且运行时库尽其所能将其拆分成argv
array.
如果你打了
a.exe \" bb \" < input.txt
你会得到argc
的4和3个参数:"
,bb
和"
.重定向会像预期的那样工作.
我认为这是cmd.exe
和C运行时库之间的一个错误,而且几乎不能做任何事情……除了要知道,在Windows命令行中使用引号是dangerous,并且只使用它来引用微不足道的空格字符.