所以我正在尝试编写一个将char ** args连接到char * args的函数 到目前为止我所拥有的是:“
char *concat(char **array)
{
int size = 0;
int i=0;
int j=0;
int z=0;
while (array[i]!=NULL)
{
printf(" %s \n", array[i]);
size = size + sizeof(array[i])-sizeof(char); //get the total size, minus the
//size of the null pointer
printf("%d \n",size);
i++;
}
size = size+1; //add 1 to include 1 null termination at the end
char *newCommand = (char*) malloc(size);
i=0;
while(i<sizeof(newCommand))
{
j=0;
z=0;
while (array[j][z]!='\0')
{
newCommand[i] = array[j][z];
i++;
z++;
}
j++;
}
newCommand[sizeof(newCommand)-1]='\0';
return newCommand;
}
这似乎不起作用。谁知道什么是错的?
答案 0 :(得分:3)
我会这样做(未经测试):
int size = 0;
int count = 0;
while (array[count]) {
size += strlen(array[i]);
count++;
}
char *newCommand = malloc(size + 1);
char *p = newCommand;
newCommand[0] = 0; // Null-terminate for the case where count == 0
for (int i = 0; i < count; i++) {
strcpy(p, array[i]);
p += strlen(array[i]);
}
首先,您的尺寸计算错误。你想要字符串的大小,但是sizeof(array[i])
给出了数组中单个元素的大小,它是一个指针,因此是4(32位)或8(64位)。您需要改为使用strlen
。
接下来,您的手动复印也已关闭。使用移动指针strcpy
更容易(通常情况下应该避免,但我们已经用strlen
计算了尺寸,所以这里没问题)。在这里使用strcpy
也会处理空终止。
答案 1 :(得分:0)
主要问题是你继续使用带有指针参数的sizeof()
,而我认为你正试图获得相应数组的大小。
sizeof()
只能为您提供编译时可用的信息,例如char
和int
等原始类型的大小,以及具有固定长度的数组的大小,例如一个char[10]
。 char *指向的字符串大小只能在运行时计算,因为它取决于传递给函数的确切值。
对于sizeof(newCommand)
,您可能需要size
,对于sizeof(array[i])
,您可能需要strlen(array[i])
。