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

推荐答案

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

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

不幸的是,同一页上写着:

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

我怀疑这就是这里发生的事情:shell (cmd.exe)看到奇数个双引号,并且不处理任何重定向.然后,它将整个命令行including the redirection传递给程序,并且运行时库尽其所能将其拆分成argvarray.

如果你打了

a.exe \" bb  \" < input.txt

你会得到argc的4和3个参数:"bb".重定向会像预期的那样工作.

我认为这是cmd.exe和C运行时库之间的一个错误,而且几乎不能做任何事情……除了要知道,在Windows命令行中使用引号是dangerous,并且只使用它来引用微不足道的空格字符.

C++相关问答推荐

如何确保内存分配在地址附近?

单指针和空参数列表之间的函数指针兼容性

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

如何在下面的C代码中正确管理内存?

从uint8_t*转换为char*可接受

为四维数组中的Dim-1和Dim-3重新分配空间

错误:字符串在C中获得意外输出

在吉陀罗中,_2_1_和CONCAT11是什么意思?

带有数组指针的 struct 在print_stack()函数中打印随机数

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

在Ubuntu上使用库部署C程序的最佳实践

`%%的sscanf无法按预期工作

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

我错误地修复了一个错误,想了解原因

无法将字符串文字分配给 C 中的字符数组

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

GDB 用内容初始化数组

Clang 是否为内联汇编生成了错误的代码?

仅使用其内存地址取消引用 C 中的 struct