您是否必须手动循环遍历数组并获取每个字符数组的strlen计数,求和,使用求和值分配目标,然后再次遍历数组?
如何找到包含字符数组的数组大小,以便迭代它们?
答案 0 :(得分:7)
如何找到包含字符数组的数组大小,以便迭代它们?
有两种方法:
char*
,并将空指针作为标记存储在其中,类似于使用NUL字符终止字符串的方式。换句话说,在分配数组时你必须自己记账,因为C不会给你所需的信息。如果您遵循第二个建议,则可以使用
获取字符串数组中的字符总数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'
保留空间。
答案 1 :(得分:1)
我假设您正在尝试创建一个字符串,该字符串是数组中所有字符串的串联。
有两种方法可以做到这一点:
按照建议进行2次传递,在第一次传递中总计长度,分配目标字符串,然后在第二次传递中附加字符串
1次通过。首先将缓冲区分配给某个大小。附加字符串,跟踪总大小。如果没有足够的空间容纳字符串,请使用realloc()
重新分配缓冲区。最有效的重新分配方法是每次将缓冲区的大小加倍。
答案 2 :(得分:0)
我想你想要连接字符串。如果是的话,是的。在分配之前,你必须知道你想要多少空间。
事实上,你可以使用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]);
}
答案 3 :(得分:0)
#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;
}