将字符串拆分为动态数组

时间:2012-11-15 18:01:44

标签: c arrays

我有一个char数组由用户或应用程序"Hello,My,Name,Is,Test"提供给我。

我需要做的是将它在动态数组中的逗号存储区拆分,因为我永远不会知道逗号的数量或字符串的大小。

我需要存储它,以便可以通过其他方法(如

)单独请求每个项目
GetItem(int index)
{   
   ... 
   return Array[index];
   ...
} 

2 个答案:

答案 0 :(得分:0)

使用strtok()最大字长小于10

的简单实现

您也可以通过其他方式执行此操作,因为这不要忘记#include<string.h>

char str[] = "Hello,My,Name,Is,Test";
char delims[] = ",";
char *result =NULL;
char final[10][10];
int i=0;
result = strtok( str, delims );
strcpy(final[i],result);
i++;
while( result != NULL ) {
    result = strtok( NULL, delims );
    strcpy(final[i],result);
    i++;
}

脚注:此处第一次致电strtok()使用str作为第一个参数,但所有后续调用都有NULL

答案 1 :(得分:0)

如果您不知道并且甚至没有字符串中逗号数量的上限,则必须解析该字符串并动态重新分配该数组。有几种策略,下面的策略并不是最优的,有利于内存碎片,但描述起来很简单。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *str       = "This,is,a,comma,delimited,string,with,a,length,of,whatever";
    char **array    = NULL;
    char *p;
    size_t  items = 0, q;
    char *sepa      = ",";

    p = str;
    for (;;)
    {
            p += strspn(p, sepa);
            if (!(q = strcspn(p, sepa)))
                    break;
            if (q)
            {
                    array           = realloc(array, (items+1) * sizeof(char *));
                    array[items]    = malloc(q+1);
                    strncpy(array[items], p, q);
                    array[items][q] = 0;
                    items++;
                    p += q;
            }
    }
    for (q = 0; q < items; q++)
    {
            printf("(%s) ", array[q]);
    }
    printf("\n");

    /* Here we have a problem. How do we return to the caller the information
       about how many items do we have? A common solution is to return the number
       of items PLUS ONE, and that one is NULL */

    array           = realloc(array, (items+1) * sizeof(char *));
    array[items]    = NULL;

    /* So this code can work without needing to know the value of "items" */
    for (q = 0; array[q]; q++)
            printf("(%s) ", array[q]);
    printf("\n");
}

BTW,我省略了检查realloc(或malloc)是否返回NULL,表示存储器错误。

另一种分配策略是在块中使用realloc,即保留两个计数器itemsreally_allocated_items,并且只有当两者相等时才重新分配。执行此操作时,您将really_allocated_items增加,例如64,并重新分配该项目数。这样,你每64只运行一次分配,最多浪费63个指针。

存在其他策略,使用递增的块大小而不是固定的64,但它们仅在内存和性能约束非常严格时才实现。

注意此实施故意不使用strtok,因为strtok 修改了原始字符串这种情况可能是不被允许的(甚至可能会让你获得一个coredump)。