我想编写调用另一个exe的c程序。在我调用原始exec之前,这个包装器程序除了设置一些环境变量之外什么都不做。
例如,假设我有一个名为test.exe
的exe,我写了testwrapper.exe
我想将其称为testwrapper.exe < parameter >
,内部应调用test.exe < parameter >
我的问题是,当我将test.exe
称为test.exe "c:\program files\input"
时,
C以“作为参数传递
是什么导致了这个问题,我该怎么做才能解决它?
答案 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函数的手册应该有所帮助:
答案 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);