c - 将字符串数组覆盖在字符数组上

标签 c

我正在工作一个需要可重入的函数 - 该函数被赋予一个内存缓冲区作为参数,并且应该使用这样的缓冲区来满足其所有内存需求。换句话说,它不能使用 malloc,而是应该从提供的缓冲区中提取内存。

我遇到的挑战是如何将字符串数组覆盖在给定大小的字符数组上(缓冲区以 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    

但是,我需要一些帮助来弄清楚如何在开头写入字符串的地址。 当然,如果有更简单的方法来完成此任务,请告诉我。

最佳答案

来看看这个。

/* 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]);

关于c - 将字符串数组覆盖在字符数组上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058678/

相关文章:

c - 生成表中元素的所有组合(语言 C)

在C中将二进制字符串转换为int

c - 放弃标题行

c - 如何在 C 语言中为特定的结构类型正确使用 free

c - 我需要在 C 中实现 Butterworth 滤波器。获取具有此功能的库或编写代码是否更容易?

c - 在函数中将变量声明为静态意味着什么?

C、通过引用传递给函数。向前传球

python - 使用 C 扩展 python 时查找内存泄漏

c - 如何从格式打印固定长度的输出

c - fprintf 不工作 C