函数 system() 中读取字符串的问题(可能是由于错误的 malloc)

Problem of a string read in function system() (probably due to a bad malloc)

chain1 = (char *) malloc(5*sizeof(char*) + 1);
                strcat(chain1, "cp mediaPlayer.exe ");
                strcat(chain1, actual->chain);
                strcat(chain1, "\n");

系统(链1);

大家好,我的实际字符串有问题...我正在尝试创建一个字符串,该字符串将在我的 [=20] 上的 shell 调用的函数系统中使用=] 但事实是它可以读取我的字符串,因为它不是以 cp mediaPlayer.exe 开头,而是这个 --> sh: 1: �P�Pcp: 然后,下面的错误在我的 shell 上发送给我,我真的不知道如何解决它。

sh: 1: �P�Pcp: 未找到

我已经用了 2 天了,但如果有人可以帮助我,我就是找不到解决方案?顺便谢谢!

在您的代码中,malloc 大小与您放入其中的数据无关。

你需要

size_t len = strlen("cp mediaPlayer.exe ") + 
             strlen(actual->chain) +
             strlen("\n") + 1; // +1 for terminating 0.
chain1 = malloc(len);
           

在那之后,您的第一个 strcat 可能会失败,因为分配的缓冲区可能不(可能不会)包含以空字符结尾的字符串。添加 chain[0] = 0; 或将第一个 strcat 更改为 strcpy.

chain1 = (char *) malloc(5*sizeof(char*) + 1);

这将为五个字符 指针 加上一个额外的字节分配足够的 space。指针与字符不同,目前它往往是四个或八个字节,但实际上可以是任何大小。你可能想要 sizeof(char) 但是,因为它总是 1,你可以在乘法中忽略它。

您可能还需要一个大于 5 的数字,因为这甚至不足以存储您的固定前缀。

此外,该分配块的当前 内容 将是任意的,因此 strcat 而不是 您的第一个操作应该对其执行(因为这需要有效的 C 字符串)。

这几乎肯定是您的“字符串以垃圾开头”问题的原因。 strcpy 作为第一个操作会更好,或者只使用 sprintf 一次完成整个操作,而不是 strcpy/multiple-strcat 序列。

最后,传递给 system 的命令不需要尾随换行符。

更好的方法可能是这样的:

static const char prefix[] = "cp mediaPlayer.exe ";
char *chain1 = malloc(sizeof(prefix) + strlen(actual->chain));
if (chain1 != NULL) {
    sprintf(chain1, "%s%s", prefix, actual1->chain);
}
终止 [=18=]

Space 是因为我在字符串上使用 sizeof 而不是 strlen。前者包括 space 作为终结符。并注意检查失败 malloc,如果您想要健壮的代码,这是您应该 总是 做的事情。我不需要提及,如果 chain1 最终成为 NULL 在此代码块的末尾,您应该 而不是 将其传递给 system.