Windows фактически передает всю необработанную командную строку как одну строку в программу; см. GetCommandLine. Когда вы пишете main(int argc, char **argv)
, библиотека времени выполнения C, с которой связана ваша программа, отвечает за разделение командной строки на слова в вашем argv
.
So Нам нужна дополнительная информация: Какова ваша оболочка, как вы вызываете свою команду и какую библиотеку времени выполнения вы используете? Проблема, которую вы видите, определенно не сама 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] <*>
$
Это только если я пытаюсь смешивать их — запускать программу, используя CRT Cygwin от ЦМД.ехе — где я потенциально видеть ваши проблемы
$ 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:\>
Двойные кавычки не работают для меня - но я использую Windows 7 ЦМД и GCC с тестовой программой. Какую версию cmd.exe вы использовали? –
Хорошо, я понял: это вещь mingw32, см. Https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html –