2017-05-06 51 views
0

我已經嘗試了一切,我的代碼看起來對我來說非常好(顯然不是如果它不工作)。如何在不知道字符串和字符大小的情況下動態創建C中的字符串數組?

我想從某些文本中讀取由逗號分隔的單詞列表,並且每個單詞都將是一個字符串數組的元素。我不知道會有多少元素或多久。

for循環是宏偉的,因爲我計算了之前有多少個字符。主要的問題是分配內存,有時我得到「段錯誤:11」當我運行它(因爲它編譯盛大),有時當我讀到的項目也得到類似:

P 25一路平安(空)heyya

時候就應該給我的東西,如:

HOLA一路平安再見heyya

我想我訪問內存我不應該。總之,這裏的代碼:

// We allocate memory for one string 
variables = (char**)calloc(1, sizeof(char*)); 
variables[0] = (char*)calloc(100, sizeof(char)); 

if (variables == NULL) { 
    return NULL; 
} 

// Now we start looking for the variables 
for (int i = comma_pos+1; i < *(second_pos + pos); i++) { 
    deleteSpaces(string, &i); 
    // If the character is not a comma, we copy the character 
    if (*(string + i) != ',') { 
     *(variables[stringnum] + j) = *(string + i); 
     j++; 
    } else { 
     // If the character is a comma, we have to allocate more memory for a new string 
     *(variables[stringnum] + j) = '\0'; 
     stringnum++; 
     j = 0; 

     char **temp = variables; 
     // We allocate more memory for a second array 
     variables = realloc(variables, sizeof(char*) * stringnum); 

     variables[stringnum] = (char*)calloc(100, sizeof(char)); 


     // If we cannot allocate more memory then get out 
     if (variables == NULL) { 
      return temp; 
     } 
    } // end else 
} // end for 

*(variables[stringnum] + j) = '\0'; 
+1

您的變量的定義不瑣碎細節,爲簡潔起見被省略,*他們是非常重要*。 **給他們看**。 –

+0

我知道它可以做到,但是需要分配一個指針數組,然後深入,然後對於該數組中的每個指針,您需要對另一個alloc進行重新分配,然而對於每一行重複一次,所以如果您有8個深刻你做了9次分配...不管多寬。 –

+0

把它當作一維數組/指針來分配所有字符串的空間,然後鏈接列表或以某種方式跳過它們,這樣更容易。 –

回答

1

它不是立即清楚我什麼是你的代碼錯誤,但它不是在所有我將如何處理這個問題。

我會首先確定有多少個子字符串,通過對源字符串中的分隔符進行計數並添加一個。這確實需要預先掃描字符串,但它可能比任何需要執行多個內存分配的替代方案便宜得多。

至於字符串本身的空間,如果您不需要保留列表的逗號分隔形式,那麼您可能能夠重新使用該空間。使用strtok()函數對它進行標記,並存儲結果指針。

如果您必須保留原始逗號分隔的字符串,那麼我建議複製整個東西,然後按照我之前建議的標記(並且您會知道從計數分隔符開始已經有多長時間)。對於單個字符串,您不需要佔用比逗號分隔的字符佔據更多的空間。

如果您更喜歡避免strtok(),那麼手動實現同樣的事情並不困難。

+0

非常感謝你,我沒有使用strok(),但關於數元素的事情使得事情變得更容易,這很有意義,謝謝你:) –

0

你必須在兩個方向上分配,也許你已經。

您需要分配深度,一個指針數組,然後爲該數組中的每個指針需要分配該行的寬度。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (void) 
{ 
    unsigned int ra; 
    unsigned int rb; 

    char **x; 

    x=malloc(100*sizeof(char *)); 
    printf("%p\n",x); 
    for(ra=0;ra<100;ra++) 
    { 
     x[ra]=malloc(ra*sizeof(char)); 
    } 

    for(ra=0;ra<100;ra++) 
    { 
     printf("%p\n",x[ra]); 
    } 

    for(ra=0;ra<100;ra++) 
    { 
     for(rb=0;rb<ra;rb++) x[ra][rb]=rb; 
    } 
    for(ra=0;ra<100;ra++) 
    { 
     for(rb=0;rb<ra;rb++) 
     { 
      printf("%u ",x[ra][rb]); 
     } 
     printf("\n"); 
    } 

    return(0); 
} 
相關問題