windows mingw asterisk’*’通过argv 传递给字符串

我在下面写了一个代码

#include int main(int argc, char *argv[]) { char cmd[50]="dir"; if (argc == 2) { sprintf(cmd,"dir %s",argv[1]); } if (argc == 3) { sprintf(cmd,"dir %s %s", argv[1], argv[2]); } printf("%s\n",cmd); system(cmd); return 0; } 

当我执行如下

在此处输入图像描述

我认为不能通过* argv []传递’*’

我怎么能传递像“* .c”这样的东西?

更新

 #include int main(int argc, char *argv[]) { char cmd[50]="dir"; if (argc == 2) { sprintf(cmd,"dir %s",argv[1]); } if (argc == 3) { sprintf(cmd,"dir %s %s", argv[1], argv[2]); } if (argc > 3) { sprintf(cmd,"dir %s %s", argv[1], argv[2]); } printf("%s\n",cmd); system(cmd); return 0; } 

改变如下 在此处输入图像描述

什么….. @。@ ?

再次更新代码

 #include #include int main(int argc, char *argv[]) { int i; char sp[2]=" ", cmd[250]="dir"; if (argc > 1) { sprintf(cmd,"dir /d "); for (i =1 ; i < argc; i ++) { strcat(cmd,sp); strcat(cmd,argv[i]); } } printf("%s\n",cmd); system(cmd); return 0; } 

看看我执行时会发生什么

在此处输入图像描述

有点难看….任何体面的想法?

此问题与C运行时无关,而与shell行为无关。 如果使用Windows CMD.EXE,则*将不变地传递给程序,而如果使用Cygwin的bash ,则shell会将*扩展为文件列表,并将此扩展作为单个参数传递给程序。 您可以通过使用"*"'*'引用通配符来阻止此扩展。

请注意,不应使用sprintf ,而应使用snprintf来避免缓冲区溢出。 如果链接到非标准Microsoft C库,则可能需要使用_snprintf

编辑:CMD.EXE似乎没有扩展通配符,但您链接程序的C运行时可能会在启动时执行。 看到这个问题: Gnuwin32 find.exe在执行搜索之前展开通配符

解决方案是引用这个论点。

编辑礼貌地承认,我担心接受的答案是不正确的。 这里发生的是在C运行时中提供了globbing行为,但默认行为在编译器之间有所不同

是的,如果你不知道发生了什么,这是一个很大的痛苦。 更糟糕的是,如果glob与任何文件都不匹配,则不会发生globbing。 我自己很惊讶。

在Visual Studio下 ,默认情况下,通配符不会在命令行参数中展开。 您可以通过链接setargv.obj或wsetargv.obj来启用此function:

 cl example.c /link setargv.obj 

在MinGW下,默认情况下,通配符在命令行参数展开。 要防止这种情况,您可以链接CRT_noglob.o,或者更容易添加全局变量:

 int _CRT_glob = 0; 

在您自己的源文件中定义main()或WinMain()。