如何在c语言中迭代字符数组?
您是否必须手动循环数组一次,并获得每个字符数组的strlen计数,求和,用求和的值分配目的地,然后再次循环数组如何在c语言中迭代字符数组?,c,c-strings,C,C Strings,您是否必须手动循环数组一次,并获得每个字符数组的strlen计数,求和,用求和的值分配目的地,然后再次循环数组 如何找到包含字符数组的数组的大小,以便可以对其进行迭代?我猜您希望连接字符串。如果是,是的。在分配空间之前,您必须知道需要多少空间 事实上,您可以使用realloc,但它实际上只是每次复制上一个字符串,效果要差得多 一些代码:(假设char*s[]和intn) 我假设您正在尝试生成一个字符串,该字符串是数组中所有字符串的串联 有两种方法可以做到这一点: 按照您的建议进行两次传递,第一次
如何找到包含字符数组的数组的大小,以便可以对其进行迭代?我猜您希望连接字符串。如果是,是的。在分配空间之前,您必须知道需要多少空间 事实上,您可以使用
realloc
,但它实际上只是每次复制上一个字符串,效果要差得多
一些代码:(假设char*s[]
和intn
)
我假设您正在尝试生成一个字符串,该字符串是数组中所有字符串的串联 有两种方法可以做到这一点:
realloc()
重新分配缓冲区。最有效的重新分配方法是每次将缓冲区的大小增加一倍char*
,并在其中存储一个空指针作为哨兵,类似于NUL字符用于终止字符串的方式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'
预留空间。\include
#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;
}
#包括
#包括
字符*nstrdup(字符**args);
int main(int argc,字符**argv)
{
char*这个;
这=nstrdup(argv+1);
printf(“[%s]\n”,这是);
返回0;
}
字符*nstrdup(字符**参数)
{
尺寸透镜,位置;
字符**pp,*结果;
len=0;
for(pp=args;*pp;pp++){
len+=strlen(*pp);
}
结果=malloc(1+len);
pos=0;
for(pp=args;*pp;pp++){
len=strlen(*pp);
memcpy(结果+位置,*pp,len);
pos+=len;
}
结果[pos]=0;
返回结果;
}
一些代码可以帮助我们理解您的要求。听起来您想复制C字符串数组。是吗?我想最终将数组中的字符串连接成一个字符串。需要知道为目标字符串分配多少内存空间。我不知道你怎么知道在for循环中把什么作为终止条件,即数组的长度。这种使用strcat的方法非常昂贵:它会导致算法在O(n²)时间内运行,而它可能是线性的。线性是如何实现的@我的问题的另一部分是,如何在这种情况下算出n是什么,好了。谢谢你回答了一切。。。。或者,如果你真的得到了一个数组(不是指针-它们不一样),就用sizeof(array)/sizeof(entry)来获取长度。许多人(过去10年左右我也是如此)认为数组和指针是一样的,但事实并非如此——如果需要,数组会自动退化为指针。e、 g.inta[10]={0};sizeof(a)/sizeof(int)将给出10;int*a=malloc(10*sizeof(int));sizeof(a)==sizeof(int*)在这种情况下,我不喜欢meta。(我不懂界面)。我确实认为编辑空白(成为某种公司规范形式)的人是较低的lif形式。请走开。别碰我的消息来源,你们这些白人编辑。如果您无法读取源代码,请返回java。请添加一个选项以接受/拒绝这些伪造的空白编辑。
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;
}
#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;
}