【问题标题】:Variable popen calls in CC中的变量popen调用
【发布时间】:2010-04-25 17:57:43
【问题描述】:

我正在尝试在 Win32 C 程序中执行 MS-DOS DEL 命令,并且我已经知道 systempopen 可以用于此目的。但是,问题在于命令都需要字符串文字(类型const char),而我需要类似于此 Perl 代码的 DOS 等价物(或多或少,不知道它是否真的有效):

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 中是否还有其他一些子进程函数允许将 char 数组作为进程名称的参数?

【问题讨论】:

  • 为什么不能将该序列用作字符串文字很明显?
  • 因为 system() 和 popen() 函数将该参数指定为“const char”类型。
  • 字符串文字对于大多数实际用途来说是一个 const char * ,如果你有一个字符串,在 C 中它只是一个指向 char 序列的指针,以一个 nul 字节终止,你可以传递它弹出/系统,。
  • 哦,我的错。问题中有错字,但现在已编辑。

标签: c windows dos popen


【解决方案1】:

这很痛苦,但您可能最终不得不取消转义所有转义字符。 "\blah" -> "\\blah" 等。查看它们的列表here

根据您的代码,我会(大致)执行以下操作:

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

这个想法是指定所有令人不安的字符转义的模式,即\\\",然后使用sprintf 得到最终的格式字符串。 getenv 的字符串不会有转义字符的问题,可以直接使用。

【讨论】:

  • 嗯...好的,但这仍然没有解释如何过滤字符串数组,如“char filelist[256][256];”这样它就可以连接成一个空格分隔的字符串,前面是“DEL”,然后输入到 system() 中,我刚刚发现除了函数调用中指定的字符串之外,它实际上确实需要指向 char 数组的指针。
  • 好吧,我最终通过逐个元素的数组比较来编写自己的解决方案。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2014-08-10
  • 2014-01-07
相关资源
最近更新 更多