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

问题描述 投票:0回答:1

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

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

外壳(CMD)

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

我的系统

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

c cmd
1个回答
4
投票

引用在 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 命令行中使用引用是危险,并且只使用它用于简单的空格字符引用。

© www.soinside.com 2019 - 2024. All rights reserved.