您是否需要手动遍历数组一次,并获取每个字符数组的strlen计数,将它们加起来,分配目标大小,然后再次遍历数组?
如何找到包含字符数组的数组的大小,以便您可以对它们进行迭代?
size_t sum_of_lengths(char const **a)
{
size_t i, total;
for (i = total = 0; a[i] != NULL; i++)
total += strlen(a[i]);
return total;
}
'\0'
留出空间。我猜你想要创建一个字符串,它是数组中所有字符串的连接。
有两种方法可以做到这一点:
像你建议的那样进行两次遍历,第一次遍历求出长度总和,分配目标字符串,第二次遍历将字符串附加到目标字符串上
进行一次遍历。首先分配缓冲区的某个大小。附加字符串,跟踪总大小。如果没有足够的空间来存储字符串,则使用 realloc()
重新分配缓冲区。最有效的重新分配方法是每次将缓冲区的大小加倍。
我猜你想要连接字符串。如果是这样,是的。你必须知道你想要分配多少空间。
实际上,你可以使用realloc
,但它只是每次复制先前的字符串,效率要低得多。
一些代码:(假设char *s[]
和int n
)
int i,l=1;
for (i=0;i<n;i++) l+=strlen(s[i]);
char *r=malloc(l);
r[0]=0;
for (i=0;i<n;i++) strcat(r,s[i]);
编辑:根据一些评论,当您知道长度时,strcat
是无效的。(尽管它可以一次性分配内存,我仍然更喜欢它。)一些更有效的代码如下:
int i,l=1;
for (i=0;i<n;i++) l+=strlen(s[i]);
char *r=malloc(l);
char *d=r;
for (i=0;i<n;i++) {
srtcpy(d,s[i]);
d+=strlen(s[i]);
}
strcat
的这种方式非常昂贵:它会导致算法运行时间为 O(n²),而实际上可以是线性的。 - Fred Foo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *nstrdup(char **args);
int main (int argc, char **argv)
{
char * this;
this = nstrdup(argv+1);
printf("[%s]\n", this );
return 0;
}
char *nstrdup(char **args)
{
size_t len, pos;
char **pp, *result;
len = 0;
for (pp = args; *pp; pp++) {
len += strlen (*pp);
}
result = malloc (1+len);
pos = 0;
for (pp = args; *pp; pp++) {
len = strlen (*pp);
memcpy(result+pos, *pp, len);
pos += len;
}
result[pos] = 0;
return result;
}