微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

<div>
  <ul>
      <li>hello world</li>
    </ul>
</div>

系统(chain1);

大家好,我的实际字符串有问题...我正在尝试创建一个字符串,该字符串将在我的 linux 上的 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);

这将为五个字符指针和一个额外的字节分配足够的空间。指针与字符不同,它目前往往是四个或八个字节,但实际上可以是任何大小。您可能想要 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);
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。