这是一个简单的C程序,它打印传递给它的命令行参数的数量:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%d\n", argc);
}
当我提供输入时
file_name *
它在我的电脑(操作系统Windows 7)中打印623而不是2。但它在其他情况下提供了正确的输出。 *
是命令行参数的保留字符吗?
请注意,此程序为以下输入提供正确的输出:
file_name *Rafi
输出= 2
答案 0 :(得分:10)
在Unix命令行上,shell负责处理通配符。 yourapp *
将运行yourapp
,并将当前目录中所有非隐藏文件的名称作为参数传递。在你的情况下,这是622个文件(623 = 622个文件+程序的名称)。
在Windows上,应用程序负责通配符解析,因此对于程序名称(argv [0]),argc为2,1,对于通配符,argc为1(argv [1] = *);
答案 1 :(得分:3)
*
由shell或运行时库扩展(前者在* nixes上,后者在Windowses上),而不是文字*
,您将获得所有文件的名称。当前的工作目录。
答案 2 :(得分:2)
正如其他人所提到的,你正在获得'shell通配符扩展'或'通配',其中*
被用作通配符,以匹配放置在argv
数组中的文件名。 / p>
在Unix系统上,这是由shell执行的,没有任何(或很少)与C运行时有关。
在Windows系统上,shell不执行此功能(除非您使用像Cygwin这样的类似Unix的shell替换)。根据您使用的工具和/或链接器选项,C运行时的初始化可能会也可能不会执行通配功能:
如果您正在使用Microsoft的编译器,则C运行时默认情况下不会执行通配,并且您的示例中的argc
值为2。但是,如果您要求链接器链接到setargv.obj
(如果您有Unicode构建,则为wsetargv.obj
),然后将globbing添加到运行时初始化中,您将获得类似于Unix的行为。 setargv.obj
已经与MSVC分发,只要我记得,但它仍然鲜为人知。我相信大多数Windows程序都会执行自己的通配符扩展。
如果您正在使用MinGW / GCC工具链,C运行时将在调用main()
之前执行通配(至少它适用于MinGW 4.6.1 - 我怀疑它是在MinGW中用于很久)。我认为MinGW可能不会为GUI程序执行globbing。您可以使用以下方法之一禁用MinGW的通配行为:
定义名为_CRT_glob
的全局变量并将其初始化为0
:
int _CRT_glob = 0;
lib/CRT_noglob.o
目标文件中的链接(我认为这可能与订单有关 - 您可能需要将其放在任何库之前):
gcc c:/mingw/lib/CRT_noglob.o main.o -o main.exe
答案 3 :(得分:1)
问题是shell会将*
扩展为当前目录中的所有文件名(不以.
开头)。这完全是关于shell的,与C程序关系不大。
argc
的值包括1表示程序自己的名称,加上shell传递的每个参数一个。
尝试:
filename *
filename '*'
第一个会给你623(给予或接受 - 但现在是时候清理那个目录了!)。第二个会给你2个。