函数 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
.
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
.