Dog*_*oge 5 c windows cmd visual-c++
main 函数中的 argc 参数不包含重定向 Command('<','>')。
但是,我在使用双引号时遇到了一个令人困惑的问题。
外壳(CMD)
3,是的!a.exe aa bb < input.txt
Run Code Online (Sandbox Code Playgroud)
3,但是5,我只想输入double quote作为参数。a.exe \" bb < input.txt
Run Code Online (Sandbox Code Playgroud)
我的系统
操作系统:windows 11,外壳:window CMD
引用在 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 命令行中使用引用是危险的,并且仅将其用于琐碎的空格字符引用。