简体   繁体   中英

Command Line Argument Counting

This is a simple C program that prints the number of command line argument passed to it:

#include <stdio.h>

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

When I give the input

file_name *

It prints 623 instead of 2 in my pc (operating system Windows 7). But it gives the correct output in other cases. Is * a reserved character for command line arguments? Note this program gives correct output for the following input:

file_name *Rafi

Output = 2

On a Unix command line, the shell is responsible for handling wildcards. yourapp * will run yourapp , and pass the name of ALL of the non-hidden files in the current directory as arguments. In your case, that's 622 files (623 = 622 files + name of the program).

On Windows, applications are responsible for wildcard parsing, so argc is 2, 1 for the name of the program (argv[0]) and 1 for the wildcard (argv[1] = *);

*由shell或运行时库(前者在* nixes上,后者在Windowses上)扩展,而不是文字*您将获得当前工作目录中所有文件的名称。

As others have mentioned, you're getting the 'shell wildcard expansion' or 'globbing' where the * is used as a wildcard to match file names to place in the argv array.

On Unix systems this is performed by the shell and has nothing (or little) to do with the C runtime.

On Windows systems, this functionality is not performed by the shell (unless possibly if you're using some Unix-like shell replacement like Cygwin). The globbing functionality may or may not be performed by the C runtime's initialization depending on what tools and/or linker options you use:

  • if you're using Microsoft's compiler, the C runtime will not perform globbing by default, and you would get an argc value of 2 in your example. However, if you ask the linker to link in setargv.obj (or wsetargv.obj if you have a Unicode build), then globbing is added to the runtime initialization and you'll get behavior similar to Unix's. setargv.obj has been distributed with MSVC for as long as I can remember, but it's still little known. I believe that most Windows programs perform their own wildcard expansion.

  • if you're using the MinGW/GCC tool chain, the C runtime will perform globbing before calling main() (at least it does for MinGW 4.6.1 - I suspect it's been in MinGW for a long time). I think MinGW might not perform globbing for GUI programs. You can disable MinGW's globbing behavior with one of the following:

    1. define a global variable named _CRT_glob and initialize it to 0 :

       int _CRT_glob = 0; 
    2. link in the lib/CRT_noglob.o object file (I think this might be order dependent - you may need to place it before any libraries):

       gcc c:/mingw/lib/CRT_noglob.o main.o -o main.exe 

The problem is that the shell expands * into all the file names (that don't start with a . ) in the current directory. This is all about the shell and very little to do with the C program.

The value of argc includes 1 for the program's own name, plus one for each argument passed by the shell.

Try:

filename *
filename '*'

The first will give you 623 (give or take - but it is time you cleaned up that directory!). The second will give you 2.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM