2017-03-28 72 views
-1

我正在工作一個需要重入的函數 - 該函數被賦予一個內存緩衝區作爲參數,並且應該使用這樣的緩衝區來滿足其所有的內存需求。換句話說,它不能使用malloc,而應該提供內存提供的緩衝區。在char數組上覆蓋字符串數組

我碰到的挑戰是如何將字符串數組覆蓋給定大小的char數組(緩衝區以char *形式提供),但是我的結果是字符串數組(char **)。

下面是一個攝製:

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

#define BUFFER_SIZE 100 
#define INPUT_ARRAY_SIZE 3 

char *members[] = { 
     "alex", 
     "danny", 
     "max" 
}; 


int main() { 
    // this simulates a buffer that is presented to my func 
    char *buffer = malloc(BUFFER_SIZE); 
    char *orig = buffer; 
    memset(buffer, NULL, BUFFER_SIZE); 

    // pointers will be stored at the beginning of the buffer 
    char **pointers = &buffer; 

    // strings will be stored after the pointers 
    char *strings = buffer + (sizeof(char *) * INPUT_ARRAY_SIZE); 

    for(int i = 0; i < INPUT_ARRAY_SIZE; i++) { 
     strncpy(strings, members[i], (strlen(members[i]) + 1)); 
     // Need to store pointer to string in the pointers section 
     // pointers[i] = strings; // This does not do what I expect 
     strings += ((strlen(members[i]) + 1)); 
    } 

    for (int i=0; i < BUFFER_SIZE; i++) { 
     printf("%c", orig[i]); 
    } 

    // Need to return pointers 
} 

隨着註釋掉有問題的線,上面打印的代碼:

   alex danny max  

不過,我需要搞清楚如何寫的地址,一些援助字符串在開始。 當然,如果有更簡單的方法來完成這項任務,請讓我知道。

+2

無關你的問題,而是'NULL'是一個空指針* *,而不是一個 「空值」。如果你想使用'memset'將內存設置爲零,那麼使用整數零'0'。 –

+2

至於你的問題,請記住數組自然衰減到指向它們的第一個元素。這使得你的數組''成員腐敗成爲'&** [成員],這是'char **'類型。所以如果你想用你的內存作爲一個指針數組,你應該使用'char **'類型的變量,就像你的'pointers'變量,但是初始化爲指向'buffer'的第一個字節(而不是地址變量'緩衝區')。然後你可以像指針數組一樣使用'指針'並初始化它的成員來指向你複製到緩衝區的字符串。 –

+2

在另一個不相關的說明中,如果您要複製完整字符串和終止符,爲什麼要使用'strncpy'?爲什麼不用簡單的'strcpy'來代替? –

回答

2

這裏來看看這個。

/* conditions : 
* 
* 'buffer' should be large enough, 'arr_length','arr' should be valid. 
*    
*/ 

char ** pack_strings(char *buffer, char * arr[], int arr_length) 
{ 

    char **ptr = (char**) buffer; 
    char *string; 
    int index = 0; 

    string = buffer + (sizeof(char *) * (arr_length+1)); /* +1 for NULL */ 
    while(index < arr_length) 
    { 
     size_t offset; 

     ptr[index] = string; 
     offset = strlen(arr[index])+1; 
     strcpy(string,arr[index]); 

     string += offset; 
     ++index; 
    } 
    ptr[index] = NULL; 
    return ptr; 
} 

使用

char **ptr = pack_strings(buffer,members,INPUT_ARRAY_SIZE); 

    for (int i=0; ptr[i] != NULL; i++) 
     puts(ptr[i]); 
+0

謝謝Binary_10 - 正是我在找的東西。 – AlexT