2012-01-28 35 views
5

您是否必须手动循环访问数组,然后获取每个字符数组的strlen数,然后求和,用相加的值分配目标值,然后再次循环数组?如何迭代c中的字符数组数组?

如何找到包含字符数组的数组的大小,以便您可以遍历它们?

+1

有些代码可以帮助我们理解你在问什么。 – user7116 2012-01-28 17:14:40

+0

听起来就像你想复制C字符串的数组。是对的吗? – vitaut 2012-01-28 17:19:28

+0

我想最终将数组中的字符串连接成单个字符串。需要知道要为目标字符串分配多少内存空间。我不明白你怎么知道要在for循环中作为终止条件放置什么,即数组的长度是多少。 – 2012-01-28 17:20:49

回答

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'

+0

我们走了。谢谢你回答一切。 – 2012-01-28 17:32:55

+1

需要返回+1,因为它是基于零的权利? – 2012-01-28 18:27:27

+0

...或者只是使用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 2013-08-14 11:15:02

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是无效的,当你知道的长度。 (我还是喜欢它,因为它在一个时间分配的内存)一些更有效的代码是:

​​
+0

这种'strcat'的使用非常昂贵:它使得算法在O(n2)时间内运行,而它可能是线性的。 – 2012-01-28 17:29:04

+0

线性如何实现? @asaelr我的问题的一部分是如何弄清楚在这种情况下n是什么。 – 2012-01-28 17:30:14

1

我假设你正试图使一个字符串,它是所有的数组中的字符串的串联。

有2种方式这样做的:

  1. 做2遍你的建议,在第二遍在第一遍的长度相加,分配目标字符串,然后追加字符串

  2. 做1次。首先将缓冲区分配给一定的大小。附加字符串,记录总大小。如果您没有足够空间存放字符串,请使用realloc()重新分配缓冲区。最有效的重新分配方法是每次将缓冲区大小加倍。

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

我不喜欢元。 (我不明白界面)。我认为那些编辑空白(以某种公司规范形式)的人是低生活形式。请走开。 **只是不接触我的来源**你whitespae编辑。如果您无法阅读源代码,请返回到java。 – wildplasser 2016-12-23 23:11:47

+0

[meta]请添加一个选项来接受/拒绝这些伪造的空白纳粹编辑。 – wildplasser 2016-12-23 23:28:46