Программа C argv не содержит двойных кавычек - PullRequest
3 голосов
/ 09 мая 2009

Я хочу написать c программу, которая вызывает другой exe. Эта программа-обертка c делает только установку некоторой переменной окружения, прежде чем я вызову свой оригинальный exec. Например, скажем, у меня есть exe-файл с именем test.exe, и я написал testwrapper.exe Я хочу назвать его как testwrapper.exe < parameter >, а внутри он должен называться test.exe < parameter >

Моя проблема в том, что когда я звоню test.exe как test.exe "c:\program files\input", C выходит с "пропусками в качестве параметра

В чем причина этой проблемы и что я могу сделать, чтобы ее исправить?

Ответы [ 6 ]

9 голосов
/ 09 мая 2009

Кавычки должны содержать аргументы с пробелами. Например:

test.exe "this is an argument with spaces"

Чтобы поместить кавычки в аргумент, избегайте их:

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

Если бы вы вызывали это из C-программы, вам бы пришлось дважды экранировать кавычки. Например:

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

Было бы полезно, однако, увидеть вашу строку кода, которая запускает test.exe.

3 голосов
/ 10 мая 2009

Ну, если вы хотите передать точные аргументы, просто используйте 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 голосов
/ 09 мая 2009

Чтобы избежать кавычек, добавьте перед ними обратную косую черту: \ "

Кроме того, вы можете использовать косую черту в качестве разделителя каталогов: / Таким образом, вам не нужно избегать обратной косой черты (вы все равно можете это сделать, если хотите: \\)

0 голосов
/ 13 мая 2009

Вы также можете добавить двойные кавычки самостоятельно.

(предупреждение: взломан, не проверен)

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);
0 голосов
/ 13 мая 2009
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);
}
0 голосов
/ 11 мая 2009

Если вы работаете в Unix-системе, используйте execv, как рекомендует sucuri. В Windows используйте _execv (), определенный в process.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...