命令行参数计数

时间:2012-02-14 17:27:21

标签: c command-line-arguments

这是一个简单的C程序,它打印传递给它的命令行参数的数量:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%d\n", argc);
}

当我提供输入时

file_name *

它在我的电脑(操作系统Windows 7)中打印623而不是2。但它在其他情况下提供了正确的输出。 *是命令行参数的保留字符吗? 请注意,此程序为以下输入提供正确的输出:

file_name *Rafi

输出= 2

4 个答案:

答案 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的通配行为:

    1. 定义名为_CRT_glob的全局变量并将其初始化为0

      int _CRT_glob = 0;
      
    2. {li>

      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个。