您是否必须手动循环访问数组,然后获取每个字符数组的strlen数,然后求和,用相加的值分配目标值,然后再次循环数组?如何迭代c中的字符数组数组?
如何找到包含字符数组的数组的大小,以便您可以遍历它们?
您是否必须手动循环访问数组,然后获取每个字符数组的strlen数,然后求和,用相加的值分配目标值,然后再次循环数组?如何迭代c中的字符数组数组?
如何找到包含字符数组的数组的大小,以便您可以遍历它们?
你如何找到包含字符数组,所以你可以在他们迭代数组的大小?
有两种方式:
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'
。
我们走了。谢谢你回答一切。 – 2012-01-28 17:32:55
需要返回+1,因为它是基于零的权利? – 2012-01-28 18:27:27
...或者只是使用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
我想你想连接字符串。如果是这样,是的。在分配之前,您必须知道您需要多少空间。
实际上,您可以使用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
是无效的,当你知道的长度。 (我还是喜欢它,因为它在一个时间分配的内存)一些更有效的代码是:
这种'strcat'的使用非常昂贵:它使得算法在O(n2)时间内运行,而它可能是线性的。 – 2012-01-28 17:29:04
线性如何实现? @asaelr我的问题的一部分是如何弄清楚在这种情况下n是什么。 – 2012-01-28 17:30:14
我假设你正试图使一个字符串,它是所有的数组中的字符串的串联。
有2种方式这样做的:
做2遍你的建议,在第二遍在第一遍的长度相加,分配目标字符串,然后追加字符串
做1次。首先将缓冲区分配给一定的大小。附加字符串,记录总大小。如果您没有足够空间存放字符串,请使用realloc()
重新分配缓冲区。最有效的重新分配方法是每次将缓冲区大小加倍。
#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;
}
我不喜欢元。 (我不明白界面)。我认为那些编辑空白(以某种公司规范形式)的人是低生活形式。请走开。 **只是不接触我的来源**你whitespae编辑。如果您无法阅读源代码,请返回到java。 – wildplasser 2016-12-23 23:11:47
[meta]请添加一个选项来接受/拒绝这些伪造的空白纳粹编辑。 – wildplasser 2016-12-23 23:28:46
有些代码可以帮助我们理解你在问什么。 – user7116 2012-01-28 17:14:40
听起来就像你想复制C字符串的数组。是对的吗? – vitaut 2012-01-28 17:19:28
我想最终将数组中的字符串连接成单个字符串。需要知道要为目标字符串分配多少内存空间。我不明白你怎么知道要在for循环中作为终止条件放置什么,即数组的长度是多少。 – 2012-01-28 17:20:49