C程序argv不包含双引号

时间:2009-05-09 19:48:53

标签: c

我想编写调用另一个exe的c程序。在我调用原始exec之前,这个包装器程序除了设置一些环境变量之外什么都不做。 例如,假设我有一个名为test.exe的exe,我写了testwrapper.exe 我想将其称为testwrapper.exe < parameter >,内部应调用test.exe < parameter >

我的问题是,当我将test.exe称为test.exe "c:\program files\input"时, C以“作为参数传递

”进行转义

是什么导致了这个问题,我该怎么做才能解决它?

6 个答案:

答案 0 :(得分:9)

引号应该允许带空格的参数。例如:

test.exe "this is an argument with spaces"

为了在参数中加上引号,请将它们转义:

test.exe "\"c:\program files\input\""

如果你是在C程序中调用它,则必须双重转义引号。例如:

system("test.exe \"\\\"c:\\program files\\input\\\"\"");

但是,查看运行test.exe

的代码行会很有帮助

答案 1 :(得分:3)

好吧,如果你想传递确切的参数,只需使用execv:

execv(argv [0],argv);

无需逃避任何事情......

所有execX函数的手册应该有所帮助:

http://www.openbsd.org/cgi-bin/man.cgi?query=execvp&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html

答案 2 :(得分:2)

通过在它们之前添加反斜杠来转义引号:\“

此外,您可能希望使用正斜杠作为目录分隔符:/这样,您不必转义反斜杠(如果您愿意,仍然可以:\\)

答案 3 :(得分:0)

如果您使用的是unix系统,请按照sucuri的建议使用execv。在Windows上使用process.h中定义的_execv()。

答案 4 :(得分:0)

int main (int argc, char *argv[])
{    
    char *install_dir = 0;
    char perlbin[MAX_PATH];
    char **new_argv;
    int index = 0;

    setlocale(LC_ALL, "");
    install_dir = get_install_dir();

    sprintf(perlbin,"%sbin%cperl.bin",install_dir,sep);
    set_env_variable(install_dir);

    new_argv = malloc(MAX_PATH);
    new_argv[0] = malloc(sizeof(char)*(strlen("perl.bin")+1));
    strcpy ( new_argv[0],"perl.bin");
    for ( index = 1 ; index < argc ; index++)
    {
        new_argv[index] = malloc( sizeof(char)*(strlen(argv[index])+1));
        strcpy ( new_argv[index], argv[index]);
    }
    new_argv[index] = NULL;

    _execv( perlbin,new_argv);
    exit (0);
}

答案 5 :(得分:0)

您也可以自己添加双引号。

(警告:快速入侵,未经测试)

char ** quoted_argv = malloc((argc - 1) * sizeof(char *));
size_t i;
for(i = 0; i < argc - 1; i++)
{
    quoted_argv[i] = malloc(strlen(argv[i + 1]) + 3); /* allocate space for \0 and quotes */
    sprintf(quoted_argv[i], "\"%s\"", argv[i + 1]);
}

/* ... use quoted_argv ... */

for(i = 0; i < argc - 1; i++)
    free(quoted_argv[i]);
free(quoted_argv);