c - 如何在 "system"命令中包含字符串变量 (char *) - linux

标签 c linux grep

char * S = "你好";//假设它是正确动态分配的

当 S 被视为值为“hello”的字符串时,我想在下面的语句中使用 S。

system("grep S searchtext.txt > result.txt");

我该怎么做?

最佳答案

一般来说,像这样使用 system 是一个非常非常糟糕的主意。 system 通过 shell 运行命令,这意味着您传递给 system 的字符串受 shell 的所有变量扩展、命令扩展、特殊字符解释等

如果您坚持使用系统,您必须首先净化您的字符串。最简单的方法是:

char *tmp = malloc(4*strlen(S)+3);
tmp[0] = '\'';
for (i=0,j=1; tmp[j]=S[i]; i++, j++)
    if (S[i]=='\'') tmp[++j]='\\', tmp[++j]='\'', tmp[++j]='\'';
tmp[j++] = '\'';
tmp[j++] = 0;
if (snprintf(cmd, sizeof cmd, "foo %s ...", tmp) >= sizeof cmd) goto error;
system(cmd);

此代码将整个字符串 S 单引号括起来,并将任何嵌入的单引号替换为 '\''。请注意,我还检查了命令行截断情况,以防它可能导致执行危险命令。

更好的选择是完全放弃 system 并执行您自己的 forkexec 来绕过 shell。然后就没有命令行可以解释了;您可以完全控制传递给外部程序的参数(*argv[] 数组)。

关于c - 如何在 "system"命令中包含字符串变量 (char *) - linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4291380/

相关文章:

regex - 从文件中提取电话号码

c++ - C 和 C++ : Partial initialization of automatic structure

c - 这个函数可以在c中将二进制转换为整数吗

linux - Sudo 和反引号?

regex - 使用grep时引用?

sed - 从多个文件中删除多行文本

c - 如何找到多维数组中具有最大值的索引

c - 为什么我可以将负数导入为 int,而不是 long int 或其他更大的数据类型?

linux - GTK3功能键;哪些已被消耗(并且无法从我的 GTK 应用程序中使用)?

linux - 当 CPU 第一次接触匿名文件 (CSAPP) 时,数据是否真的在磁盘和内存之间传输