我有一個char
陣列由用戶或應用程序"Hello,My,Name,Is,Test"
給我。將字符串拆分爲動態數組
我需要做的就是將它分割成逗號存儲在動態數組中,因爲我永遠不會知道逗號的數量或字符串的大小。
我需要存儲這使每個物品都可以通過其他方法單獨請求像
GetItem(int index)
{
...
return Array[index];
...
}
我有一個char
陣列由用戶或應用程序"Hello,My,Name,Is,Test"
給我。將字符串拆分爲動態數組
我需要做的就是將它分割成逗號存儲在動態數組中,因爲我永遠不會知道逗號的數量或字符串的大小。
我需要存儲這使每個物品都可以通過其他方法單獨請求像
GetItem(int index)
{
...
return Array[index];
...
}
用低於10
最大字長strtok()
只是簡單的實現你可以在其他做順便也,這個不要忘記#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
我希望,這可能會對你有所幫助 – Omkant
大家好, 謝謝大家花費在幫助我的時間和精力。我會嘗試你的建議,並讓你知道哪一個爲我工作 – user1119522
這是代碼中的一個醜陋的重複。爲什麼不:'char * data = str; while((result = strtok(data,delims))!= NULL){strcpy(final [i ++],result); data = NULL; }'當strtok()返回NULL時,這也消除了NULL的拷貝(對於源的空指針,'strcpy()'的行爲是未定義的!)。 –
如果不知道和甚至還沒有一個上限逗號的數字串中,你必須解析字符串並動態地重新分配數組。有幾種策略,下面的策略並不是最優的,有利於內存碎片化,但描述起來很簡單。
#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
,並且只在兩者相等時才重新分配。當你這樣做時,你通過64來增加really_allocated_items
,並重新分配這些項目數量。這樣,你只能每64分鐘執行一次分配,而最多浪費63個指針。
其他策略存在,使用遞增塊大小而不是固定64,但它們僅在內存和性能約束非常緊時才實現。
注意此實現故意不使用strtok
,因爲strtok
修改原始字符串並在某些情況下,這可能不會被允許的(甚至可能獲得你一個核心轉儲)。
問題確實使用了一個數組'char str [] =「...」;'這是可修改的。如果試圖這樣做,那麼使用'char * str =「...」;'的代碼將會修改字符串文字是不合適的。一般來說,'strtok()'是一件討厭的工作,你也是正確的。有時候,這是足夠的,但我總是竭盡全力避免它。將數組大小增加1可能會導致二次行爲。 –
使用'strtok()''',' – Omkant
有多種方法可以解決這個問題。您可以進行多次迭代:1.確定字符串中元素的數量,(2.確定元素的長度),3.填充最終數組。 2.可以使用可以保證不會溢出的緩衝區來替換。或者使用堆棧/列表添加新項目並在之後將其轉換爲數組。當然還有更多的方法可以做到這一點。 –
可能重複的[C - tokenise數組字符](http://stackoverflow.com/questions/8022468/c-tokenise-array-of-chars) – 2012-11-15 18:06:02