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()。