如何预先确定malloc的大小以连接字符串数组?
实现具有以下原型的append函数。函数返回一个字符串,该字符串表示字符串数组中所有字符串的串联。对于这个问题,您可以假设参数数组的末尾标记为如何预先确定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); 第二个过
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只是问如何计算尺寸,没有更多(添加注释)。