如何在c语言中迭代字符数组?

如何在c语言中迭代字符数组?,c,c-strings,C,C Strings,您是否必须手动循环数组一次,并获得每个字符数组的strlen计数,求和,用求和的值分配目的地,然后再次循环数组 如何找到包含字符数组的数组的大小,以便可以对其进行迭代?我猜您希望连接字符串。如果是,是的。在分配空间之前,您必须知道需要多少空间 事实上,您可以使用realloc,但它实际上只是每次复制上一个字符串,效果要差得多 一些代码:(假设char*s[]和intn) 我假设您正在尝试生成一个字符串,该字符串是数组中所有字符串的串联 有两种方法可以做到这一点: 按照您的建议进行两次传递,第一次

您是否必须手动循环数组一次,并获得每个字符数组的strlen计数,求和,用求和的值分配目的地,然后再次循环数组


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

我猜您希望连接字符串。如果是,是的。在分配空间之前,您必须知道需要多少空间

事实上,您可以使用
realloc
,但它实际上只是每次复制上一个字符串,效果要差得多

一些代码:(假设
char*s[]
intn


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

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

  • 按照您的建议进行两次传递,第一次传递中求和长度,分配目标字符串,然后在第二次传递中追加字符串

  • 通过1次。首先将缓冲区分配到一定的大小。追加字符串,跟踪总大小。如果没有足够的空间容纳字符串,请使用
    realloc()
    重新分配缓冲区。最有效的重新分配方法是每次将缓冲区的大小增加一倍

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

    有两种方法:

  • 在变量中分配数组时,记录数组中的字符串数
  • 在数组末尾分配一个额外的
    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'
    预留空间。

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