我正试图将通过argv[]传递的多个参数连接到一个c字符串中。我不使用char数组,因为我不希望对通过argv[]传递的字符数量有任何限制。
这是我如何执行程序的一个例子。
可执行-cmd rotn 13 Hello World
char *externalCommand = NULL;
if (argc >= 3 && strcmp(argv[1], "-cmd") == 0)
{
externalCommand = (char *)malloc(sizeof(char) * (strlen(argv[2]) + 1));
strcpy(externalCommand, argv[2]);
for (int i = 3; i < argc; ++i)
{
int textLength = strlen(externalCommand);
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1));
strcpy(externalCommand + textLength, " ");
strcpy(externalCommand + textLength + 1, argv[i]);
}
}
我的目标是以字符串"externalCommand"结尾,使其相等:"rotn 13 Hello World"当我第一次执行for循环时,externalCommand是"rotn13",这是正常的。
当我第二次遍历循环时,当我运行realloc()时,我会出现奇怪的行为。externalCommand变为"rotnÍ205;ýý"。我知道这些是垃圾值,但我不明白为什么realloc()会覆盖字符串中的数字"13"。
为了解决这个问题,我可以替换:
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1));
带有:
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 3));
这不会覆盖值13。
我想知道为什么在重新分配时需要在textLength中添加3。
您的realloc()
没有分配足够的内存来容纳要复制到缓冲区中的数据。使用这个替代:
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1 + strlen(argv[i]) + 1));
也就是说,如果预先计算缓冲区大小,就可以去掉realloc()
并使用单个malloc()
:
char *externalCommand = NULL;
if (argc >= 3 && strcmp(argv[1], "-cmd") == 0)
{
int textlength = strlen(argv[2]);
for (int i = 3; i < argc; ++i)
textLength += (1 + strlen(argv[i]));
externalCommand = (char *)malloc(sizeof(char) * (textLength + 1));
strcpy(externalCommand, argv[2]);
for (int i = 3; i < argc; ++i)
{
strcat(externalCommand, " ");
strcat(externalCommand, argv[i]);
}
}
realloc()
将ptr指向的内存块的大小更改为作为输入传递的字节大小
您缺少argv[i]的分配
您应该给出所需的总大小,作为realloc 的参数
在realloc中,您需要将大小给定为textLength+strlen(argv[i])+2