Windows фактически передает всю необработанную командную строку как одну строку в программу; см. GetCommandLine . Когда вы пишете main(int argc, char **argv)
, библиотека времени выполнения C, с которой связана ваша программа, отвечает за разбиение командной строки на слова в вашем argv
.
Итак, нам нужна дополнительная информация : какая у вас оболочка, как вы вызываете свою команду и какую библиотеку времени выполнения C вы используете? Проблема, которую вы видите, определенно связана не с самой Windows, и я не могу воспроизвести ее здесь с помощью cmd.exe и CRT MSVC.
C:>type CON > test.c
#include <stdio.h>
int main(int argc, char **argv) {
int i;
printf("%d\n", argc);
for (i = 0; i < argc; i++)
printf("[%d] <%s>\n", i, argv[i]);
return 0;
}
^Z
C:\>cl test.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe
test.obj
C:\>test.exe *
2
[0] <test.exe>
[1] <*>
C:\>
Если я использую CRT Cygwin и запускаю из оболочки Cygwin Bash, то я тоже не вижу проблем.
C:\>C:\cygwin\bin\bash -l
$ cd /cygdrive/c
$ cc test.c
$ ./a.exe '*'
2
[0] <./a>
[1] <*>
$
Это только если я попытаюсь смешать их & mdash; запустить программу с использованием CRT Cygwin из cmd.exe & mdash; где я потенциально вижу вашу проблему
$ exit
C:\>a.exe *
19
[0] <a>
[1] <AUTOEXEC.BAT>
[2] <BOOT.INI>
[3] <CONFIG.SYS>
[4] <Documents and Settings>
[5] <IO.SYS>
[6] <MSDOS.SYS>
[7] <NTDETECT.COM>
[8] <NTLDR>
[9] <Program Files>
[10] <RECYCLER>
[11] <Recycled>
[12] <System Volume Information>
[13] <WINDOWS>
[14] <cygwin>
[15] <hiberfil.sys>
[16] <pagefile.sys>
[17] <temp>
[18] <a.exe>
C:\>
но я не вижу проблемы с двойными кавычками.
C:\>a.exe "*"
2
[0] <test.exe>
[1] <*>
C:\>