Переменные поп-звонки в C - PullRequest
0 голосов
/ 25 апреля 2010

Я пытаюсь выполнить команды MS-DOS DEL внутри программы Win32 C, и я уже знаю, что system и popen могут использоваться для этого.Однако проблема в том, что оба требуют строковых литералов (типа const char) для команд, и мне нужно что-то вроде DOS-эквивалента этого кода Perl (более или менее, не знаю, работает ли он на самом деле):

my $user = $ENV{'USERNAME'};
my $directory = $ENV{'HOME'};
my $files = system("dir " . $directory);
my $pattern = "s/(\d{7,8})|(\"" . $user . "\")/";
$files ~= $pattern;
system("rm " . $files);

, который, очевидно, должен использовать строковые литералы для команды rm.Есть ли какая-нибудь другая функция подпроцесса в C, которая допускает использование массивов символов в качестве аргументов для имен процессов?

1 Ответ

2 голосов
/ 25 апреля 2010

Это боль, но вам, вероятно, в конечном итоге придется убегать от всех спасающихся персонажей. "\blah" -> "\\blah" и т. Д. См. Их список здесь .

Исходя из вашего кода, я бы сделал что-то вроде (примерно):

pattern = "s/(\\d{7,8})|(\\\"%s\\\")/";
char buff[100];
sprintf(buff, getenv("HOME"));
system(buff);

Идея состоит в том, чтобы указать шаблон со всеми экранированными символами, т. Е. \\ и \", затем использовать sprintf. чтобы получить окончательную строку формата. Строка из getenv не будет иметь проблем с escape-символами, поэтому вы можете использовать ее напрямую.

...