如何解决在函数 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 举报,一经查实,本站将立刻删除。