繁体   English   中英

C将Char * 2-D阵列展平为1-D

[英]C Flatten 2-D Array of Char* to 1-D

说我有以下代码:

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

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

现在,我怎么能把这个数组压平成1-D? 有可能这样做,new_1D_array [2]仍然是'cat',new_1D_array [400]仍然是'空间',等等?

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

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

代码清单


#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

上面的答案打败了我,看起来很棒,但我会在这里完成我的想法。

在这个版本中,flatArray的每个第11个字节将包含原始数组中字符串的开头,这使得从之前的字符串中找到原始字符串非常容易 - 即字符串索引2将从2*11 == index 22和字符串开始400将从400 * 11 == index 4400 这样,您就不需要遍历平面数组计数终止符来查找旧字符串。 这样做的代价是平面阵列比原始阵列占用更多的内存。

char* array[1000];

// Malloc new buffer
char *flatArray = malloc(length * 1100);

for(i=0; i<1000; i++)
{  
    strncpy(&flatArray[i * 11], array[i], 10);
    flatArray[i * 11 + 10] = '\0';
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM