使用 C 时,argc 参数包括重定向命令在 Windows CMD 中?

Dog*_*oge 5 c windows cmd visual-c++

main 函数中的 argc 参数不包含重定向 Command('<','>')。

但是,我在使用双引号时遇到了一个令人困惑的问题。

外壳(CMD)

  • 我预计 argc 是3,是的!
a.exe aa bb < input.txt
Run Code Online (Sandbox Code Playgroud)
  • 我期望 argc 也是3,但是5,我只想输入double quote作为参数。
a.exe \" bb < input.txt
Run Code Online (Sandbox Code Playgroud)

我的系统

操作系统:windows 11,外壳:window CMD

Ser*_*sta 5

引用在 Linux 等类 Unix 系统中得到了很好的定义:您可以在单引号或双引号中包含文本(参数插值具有不同的行为),并且反斜杠无条件引用其后面的字符。此外,所有这些引号都会被 shell 很好地吃掉,并且您的程序会收到预期的不带引号的字符串。

不幸的是,Windows shell ( cmd.exe) 并不那么友好。没有重定向的整个命令行将传递给程序,并且 C 运行时库处理引用规则。这些规则在Microsoft 文档中进行了描述,并且正如预期的那样, a\"作为单个字符串参数传递。

不幸的是,同一页说:

用双引号括起来的字符串被解释为单个参数,...如果命令行在找到右双引号之前结束,则到目前为止读取的所有字符都将作为最后一个参数输出。

我怀疑这就是这里发生的情况:shell ( cmd.exe) 看到奇数个双引号并且不处理任何重定向。然后它传递整个命令行,包括到程序的重定向,并且运行时库尽力将其拆分到数组中argv

如果您输入了

a.exe \" bb  \" < input.txt
Run Code Online (Sandbox Code Playgroud)

您将获得 4 个 forargc和 3 个参数:"bb"。并且重定向会按预期工作。

cmd.exe恕我直言,这是C 运行时库之间分割的一个错误,几乎没有什么可以做的......除了意识到在 Windows 命令行中使用引用是危险的,并且仅将其用于琐碎的空格字符引用。