如何在C语言中遍历字符数组的数组?

5

您是否需要手动遍历数组一次,并获取每个字符数组的strlen计数,将它们加起来,分配目标大小,然后再次遍历数组?

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


1
一些代码会帮助我们理解你在问什么。 - user7116
听起来你想要复制C字符串数组。是这样吗? - vitaut
我最终想将数组中的字符串连接成一个字符串。需要知道为目标字符串分配多少内存空间。我不明白你如何确定在for循环中放置终止条件,即数组的长度是多少。 - Walt
4个回答

7
如何找到包含字符数组的数组的大小以便迭代它们?
有两种方法:
1.在分配变量时在数组中记录字符串的数量。
2.在数组末尾分配一个额外的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' 留出空间。

好的,谢谢回答了所有问题。 - Walt
如果您真的拥有一个数组(而不是指针——它们不同),则可以使用sizeof(array)/ sizeof(entry)获取长度。许多人(包括我过去10年左右)认为数组和指针是相同的,但它们并不相同。例如,int a [10] = {0}; sizeof(a)/ sizeof(int)将给出10; int * a = malloc(10 * sizeof(int));在这种情况下,sizeof(a)== sizeof(int *)。 - griffin

1

我猜你想要创建一个字符串,它是数组中所有字符串的连接。

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

  1. 像你建议的那样进行两次遍历,第一次遍历求出长度总和,分配目标字符串,第二次遍历将字符串附加到目标字符串上

  2. 进行一次遍历。首先分配缓冲区的某个大小。附加字符串,跟踪总大小。如果没有足够的空间来存储字符串,则使用 realloc() 重新分配缓冲区。最有效的重新分配方法是每次将缓冲区的大小加倍。


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]);
}

使用 strcat 的这种方式非常昂贵:它会导致算法运行时间为 O(n²),而实际上可以是线性的。 - Fred Foo
线性可以如何实现?@asaelr 我的问题的一部分是如何确定在这种情况下n的值。 - Walt

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;
}

我不喜欢元数据。(我不理解接口)。我认为那些将空格编辑成某种公司规范形式的人是低等生物。请离开。别碰我的源代码,你这些空格编辑者。如果你看不懂源代码,请回到Java去。 - wildplasser
【元数据】请添加一个选项来接受/拒绝这些虚假的空格纳粹编辑。 - wildplasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接