我在下面写了一段代码
#include<stdio.h>
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;
}
我执行时如下
我认为无法通过&#39; *&#39; * argv []
我怎样才能传递像&#34; *。c&#34; ?
更新
码
#include<stdio.h>
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<stdio.h>
#include<string.h>
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;
}
看看我执行时会发生什么
有点难看......任何体面的想法?答案 0 :(得分:2)
此问题与C运行时无关,而与shell行为无关。如果您使用Windows CMD.EXE,*将不变地传递给程序,而如果您使用Cygwin的bash
,则shell会将*
扩展到文件列表,并将此扩展作为单独的参数传递给您程序。您可以通过使用"*"
或'*'
请注意,不应使用sprintf
,而应使用snprintf
来避免缓冲区溢出。如果链接到非标准Microsoft C库,则可能需要使用_snprintf
。
编辑:CMD.EXE似乎没有扩展通配符,但是您链接程序的C运行时可能会在启动时执行。请参阅此问题:Gnuwin32 find.exe expands wildcard before performing search
解决方案是引用这个论点。
答案 1 :(得分:1)
我担心接受的答案是不正确的,因为编辑礼貌地承认。这里发生的事情是在C运行时提供了通配行为,但默认行为在编译器之间有所不同。
是的,如果你不知道发生了什么,这是一个很大的痛苦。更糟糕的是,如果glob与任何文件都不匹配,则不会发生globbing。我自己很惊讶。
在Visual Studio下,默认情况下,通配符不在命令行参数中展开。您可以通过链接setargv.obj或wsetargv.obj来启用此功能:
cl example.c /link setargv.obj
在MinGW下,默认情况下,在命令行参数中展开通配符 。为了防止这种情况,您可以链接CRT_noglob.o,或者更轻松地添加全局变量:
int _CRT_glob = 0;
在您自己的源文件中定义main()或WinMain()。