2012-11-15 55 views
0

我有一個char陣列由用戶或應用程序"Hello,My,Name,Is,Test"給我。將字符串拆分爲動態數組

我需要做的就是將它分割成逗號存儲在動態數組中,因爲我永遠不會知道逗號的數量或字符串的大小。

我需要存儲這使每個物品都可以通過其他方法單獨請求像

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

使用'strtok()''',' – Omkant

+0

有多種方法可以解決這個問題。您可以進行多次迭代:1.確定字符串中元素的數量,(2.確定元素的長度),3.填充最終數組。 2.可以使用可以保證不會溢出的緩衝區來替換。或者使用堆棧/列表添加新項目並在之後將其轉換爲數組。當然還有更多的方法可以做到這一點。 –

+0

可能重複的[C - tokenise數組字符](http://stackoverflow.com/questions/8022468/c-tokenise-array-of-chars) – 2012-11-15 18:06:02

回答

0

用低於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

+0

我希望,這可能會對你有所幫助 – Omkant

+0

大家好, 謝謝大家花費在幫助我的時間和精力。我會嘗試你的建議,並讓你知道哪一個爲我工作 – user1119522

+0

這是代碼中的一個醜陋的重複。爲什麼不:'char * data = str; while((result = strtok(data,delims))!= NULL){strcpy(final [i ++],result); data = NULL; }'當strtok()返回NULL時,這也消除了NULL的拷貝(對於源的空指針,'strcpy()'的行爲是未定義的!)。 –

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

順便說一句,我已經省略,以檢查realloc(或malloc)是否返回NULL,表明存儲器錯誤。

另一種分配策略是以塊爲單位使用realloc,即保留兩個計數器itemsreally_allocated_items,並且只在兩者相等時才重新分配。當你這樣做時,你通過64來增加really_allocated_items,並重新分配這些項目數量。這樣,你只能每64分鐘執行一次分配,而最多浪費63個指針。

其他策略存在,使用遞增塊大小而不是固定64,但它們僅在內存和性能約束非常緊時才實現。

注意此實現故意不使用strtok,因爲strtok修改原始字符串並在某些情況下,這可能不會被允許的(甚至可能獲得你一個核心轉儲)。

+0

問題確實使用了一個數組'char str [] =「...」;'這是可修改的。如果試圖這樣做,那麼使用'char * str =「...」;'的代碼將會修改字符串文字是不合適的。一般來說,'strtok()'是一件討厭的工作,你也是正確的。有時候,這是足夠的,但我總是竭盡全力避免它。將數組大小增加1可能會導致二次行爲。 –