0

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

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

我需要存储它,以便可以通过另一种方法单独请求每个项目,例如

GetItem(int index)
{   
   ... 
   return Array[index];
   ...
} 
4

2 回答 2

1

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

#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");
}

顺便说一句,我省略了检查realloc(或malloc)是否返回 NULL,表示内存错误。

另一种分配策略是realloc在块中使用,即,您保留两个计数器itemsreally_allocated_items,并且仅当两者相等时才重新分配。当你这样做时,你会增加really_allocated_items,比如说,64,然后重新分配那个数量的项目。这样,您每 64 只运行一次分配,最多浪费 63 个指针。

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

注意此实现有意不使用strtok,因为strtok 修改了原始字符串,在某些情况下可能不允许这样做(甚至可能为您获得一个核心转储)。

于 2012-11-15T18:30:46.753 回答
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

于 2012-11-15T18:11:23.553 回答