如何预先确定malloc的大小以连接字符串数组?

如何预先确定malloc的大小以连接字符串数组?,c,string,pointers,C,String,Pointers,实现具有以下原型的append函数。函数返回一个字符串,该字符串表示字符串数组中所有字符串的串联。对于这个问题,您可以假设参数数组的末尾标记为NULL。您需要为结果字符串分配内存。不能修改数组参数 char* append(char *data[]); 我不知道如何确定指针的大小。malloc 第一次通过计算长度之和: size_t len = 0; for (char** pstr = data; *pstr; pstr++) len += strlen(*pstr); 第二个过

实现具有以下原型的append函数。函数返回一个字符串,该字符串表示字符串数组中所有字符串的串联。对于这个问题,您可以假设参数数组的末尾标记为
NULL
。您需要为结果字符串分配内存。不能修改数组参数

char* append(char *data[]); 

我不知道如何确定指针的大小。
malloc

第一次通过计算长度之和:

size_t len = 0;
for (char** pstr = data; *pstr; pstr++)
    len += strlen(*pstr);
第二个过程连接所有字符串:

char *str = malloc(len + 1);
str[0] = '\0';
for (char** pstr = data; *pstr; pstr++)
    strcat(str, *pstr);
return str;
可以通过存储最后一次连接的端点来优化连接零件:

char *str = malloc(len + 1);
str[0] = '\0';

char *p = str;
for (char** pstr = data; *pstr; pstr++) {
    strcat(p, *pstr);
    p += strlen(*pstr);
}

首先,要知道一个字符串的大小,可以使用库
string.h
中的
strlen
。如果要计算所有大小的总和,只需使用一个循环,将所有
strlen
s相加,然后为终端
NUL
字符添加
1
,如下所示:

char* append(char *data[]) {
    char **cur, *res;
    size_t len = 0;

    for (cur = data; *cur != NULL; *cur++)
        len += strlen(*cur);

    res = malloc(len + 1);

    // Now you can concatenate the strings...
}

哦,别忘了检查
malloc
返回的指针是否有效(即不
NULL
)。

在指针上循环并计数字符,直到找到终止符。但是请注意,这个签名是错误的。对于
char*
数组大小,您需要一个附加参数。您需要在分配内存之前计算该大小zone@MichaelPittino:参数是以
NULL
Ah结尾的指针数组,对。那么,他所需要做的就是在字符指针数组上循环,然后在每个字符指针上循环。你知道如何创建单个字符串的动态分配副本(例如,类似于
char*mkcopy(char*str)
)?缺少溢出检查,缺少
malloc
失败检查,对
str[len]
的赋值是冗余的,复制循环具有O(n^2)性能。不推荐。@melpomene我不了解O(n^2)的性能。你怎么能不经过所有的关卡就做到这一点呢?还有什么是
n
n
是字符串的数量。请看详细的解释。没错,我从未想过,但事实上是这样@melpomene既然
strcat
只返回
*dest
指针,您认为如何避免这种情况?应该手动连接字符串吗?是的,这样看起来更好。请注意,在上一个版本中,您可以将
strcat
替换为
strcpy
,因为您的代码保留了
p
始终指向NUL字节的不变量。
*cur++
解析为
*(cur++)
*
什么也不做。缺少溢出检查,缺少malloc检查失败。@melpomene您是说对于可能非常长的长字符串数组,
大小\u t
溢出?这看起来不像是那种家庭作业。。。根据
malloc
检查,我知道,但op只是问如何计算尺寸,没有更多(添加注释)。