windows mingw asterisk' *'通过argv [1]传递给字符串

时间:2015-11-22 21:01:42

标签: c mingw argv

我在下面写了一段代码

#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;
}

我执行时如下

enter image description here

我认为无法通过&#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;
}

改变如下 enter image description here

什么..... @。@?

再次更新代码

#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;
}

看看我执行时会发生什么

enter image description here

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

2 个答案:

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