main函数中的argc参数不包含重定向Command('<','>')。
但是,我在使用双引号时遇到了一个令人困惑的问题。
外壳(CMD)
3
是的!a.exe aa bb < input.txt
3
,但是5
,我只想输入double quote
作为参数。a.exe \" bb < input.txt
我的系统
操作系统:windows 11,外壳:window CMD
引用在 Linux 等类 Unix 系统中得到了很好的定义:您可以在单引号或双引号中包含文本(参数插值具有不同的行为),并且反斜杠无条件地 quotes 其后面的字符。此外,所有这些引号都会被 shell 很好地吃掉,并且您的程序会收到预期的不带引号的字符串。
不幸的是,Windows shell (
cmd.exe
) 并不那么友好。没有重定向的整个命令行将传递给程序,并且 C 运行时库处理引用规则。这些规则在 Microsoft 文档 中进行了描述,并且按预期,\"
作为单个字符串参数传递。
不幸的是,同一页面说:
双引号括起来的字符串被解释为单个参数,...如果命令行在找到右双引号之前结束,则到目前为止读取的所有字符都将作为最后一个参数输出。
我怀疑这就是这里发生的情况:shell (
cmd.exe
) 看到奇数个双引号并且不处理任何重定向。然后,它将整个命令行 包括重定向 传递给程序,并且运行时库会尽力将其拆分为 argv
数组。
如果您已输入
a.exe \" bb \" < input.txt
您将获得 4 个
argc
和 3 个参数:"
、bb
和 "
。并且重定向会按预期工作。
恕我直言,这是
cmd.exe
和 C 运行时库之间的拆分中的一个错误,而且几乎无能为力......除了意识到在 Windows 命令行中使用引用是危险,并且只使用它用于简单的空格字符引用。