我有char
一个用户或应用程序给我的数组"Hello,My,Name,Is,Test"
。
我需要做的是在逗号上拆分它,将它存储在一个动态数组中,因为我永远不会知道逗号的数量或字符串的大小。
我需要存储它,以便可以通过另一种方法单独请求每个项目,例如
GetItem(int index)
{
...
return Array[index];
...
}
如果您不知道字符串中逗号的数量甚至没有上限,则必须解析字符串并动态重新分配数组。有几种策略,下面的一种并不是真正的最佳策略,有利于内存碎片,但描述起来很简单。
#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
在块中使用,即,您保留两个计数器items
和really_allocated_items
,并且仅当两者相等时才重新分配。当你这样做时,你会增加really_allocated_items
,比如说,64,然后重新分配那个数量的项目。这样,您每 64 只运行一次分配,最多浪费 63 个指针。
存在其他策略,使用递增的块大小而不是固定的 64,但它们仅在内存和性能限制非常严格时实施。
注意此实现有意不使用strtok
,因为strtok
修改了原始字符串,在某些情况下可能不允许这样做(甚至可能为您获得一个核心转储)。
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