5

您是否必须手动遍历数组一次并获取每个字符数组的 strlen 计数,对其求和,用求和值分配目标,然后再次遍历数组?

如何找到包含字符数组的数组的大小,以便对它们进行迭代?

4

4 回答 4

7

如何找到包含字符数组的数组的大小,以便对它们进行迭代?

有两种方法:

  1. 在变量中分配时记录数组中的字符串数。
  2. 在数组末尾分配一个 extrachar*并将一个空指针存储在其中作为哨兵,类似于使用 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'在进行实际连接时,不要忘记为 a 预留空间。

于 2012-01-28T17:28:27.347 回答
1

我假设您正在尝试创建一个字符串,该字符串是数组中所有字符串的串联。

有两种方法可以做到这一点:

  1. 按照您的建议进行 2 次传递,对第一次传递中的长度求和,分配目标字符串,然后在第二次传递中附加字符串

  2. 完成 1 次传球。首先将缓冲区分配给某个大小。附加字符串,跟踪总大小。如果您没有足够的空间容纳字符串,请使用 重新分配缓冲区realloc()。最有效的重新分配方法是每次将缓冲区大小加倍。

于 2012-01-28T17:21:54.720 回答
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]);
}
于 2012-01-28T17:20:41.960 回答
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;
}
于 2012-01-28T17:35:59.093 回答