C 将 Char* 的二维数组展平为一维

标签 c arrays char flatten

假设我有以下代码:

char* array[1000]; // An array containing 1000 char*

// So, array[2] could be 'cat', array[400] could be 'space', etc.

现在,我如何将这个数组展平为一维?是否可以这样做,使 new_1D_array[2] 仍然是“cat”,new_1D_array[400] 仍然是“space”,等等?

最佳答案

您有一个 pointer-to-char 类型的一维数组,包含 1000 个这样的元素。就数组而言,它已经是一维的,尽管它可以被解释为“锯齿状的二维数组”。如果你想将它转换成一个巨大的字符数组,你可以这样做,这需要计算你需要存储它的缓冲区的大小,然后展平数组。

请注意,如果您选择使用 malloc 而不是 calloc,则必须手动将最后一个字符设置为 '\0'0 以便最终结果是一个 NULL 分隔的 C 风格字符串,而不仅仅是一个字符数组,因为两者中的后者不适用于 C 字符串操作,而前者会的。

代码 list


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

int main(void) {
        const char* array[] = { "one", "two", "three", "four" };
        size_t length = sizeof(array) / sizeof(char*);

        int i;
        int sum = 0;
        int count = 0;

        for (i=0; i<length; i++) {
                printf("Element #%d - %s\n", i, array[i]);
                sum += strlen(array[i]) + 1;
        }
        sum++;  // Make room for terminating null character

        char* buf;
        if ((buf = calloc(sum, sizeof(char))) != NULL) {
                for (i=0; i<length; i++) {
                        memcpy(buf+count, array[i], strlen(array[i]));
                        count += strlen(array[i]) + 1;
                        buf[count-1] = '#';
                }
                printf("Output Buffer: %s\n", buf);
                printf("Buffer size:%d - String Length:%d\n", sum, strlen(buf));
                free(buf);
                buf = NULL;
        }

        return 0;
}

示例输出


Element #0 - one
Element #1 - two
Element #2 - three
Element #3 - four
Output Buffer: one#two#three#four#
Buffer size:20 - String Length:19

关于C 将 Char* 的二维数组展平为一维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088591/

相关文章:

c - 在 C 中将文件名作为参数传递

c - 使用函数 isAlphabetic 用 C 语言编写程序来确定字符串是否严格包含字母

c# - 如何清除 BindingList Comepeltly

C sizeof 字符指针

C++查找二维数组中两点之间的距离

c++ - 将字节数组转换为 float

c - unix中的加载命令文件如何获取参数?

C数组/指针问题

javascript - 使用 setPrototypeOf 进行数组子类化

Java计算数组中字符的大小