我有一个char
数组由用户或应用程序"Hello,My,Name,Is,Test"
提供给我。
我需要做的是将它在动态数组中的逗号存储区拆分,因为我永远不会知道逗号的数量或字符串的大小。
我需要存储它,以便可以通过其他方法(如
)单独请求每个项目GetItem(int index)
{
...
return Array[index];
...
}
答案 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
,即保留两个计数器items
和really_allocated_items
,并且只有当两者相等时才重新分配。执行此操作时,您将really_allocated_items
增加,例如64,并重新分配该项目数。这样,你每64只运行一次分配,最多浪费63个指针。
存在其他策略,使用递增的块大小而不是固定的64,但它们仅在内存和性能约束非常严格时才实现。
注意此实施故意不使用strtok
,因为strtok
修改了原始字符串这种情况可能是不被允许的(甚至可能会让你获得一个coredump)。