【问题标题】:Convert an int** array into a char** array of a different size / composition [closed]将 int** 数组转换为不同大小/组成的 char** 数组 [关闭]
【发布时间】:2016-12-31 04:17:54
【问题描述】:

我正在尝试将如下所示的 int** 数组转换为由行数组成并以逗号分隔的 char** 数组。

1 2 3 4
5 6 7 8
9 3 2 1

我希望 char** 数组表示为的示例类似于 [['1','1','2','3','4'], ['2' ,'5','6','7','8'] , ['3','9','3','2','1']] 其中每第 0 个索引表示为行号。我不太确定如何实现这一点,是否有任何已知的方法可以将 int** 转换为类似的东西?谢谢。

【问题讨论】:

  • 请展示您迄今为止的研究/调试工作。请先阅读How to Ask页面。
  • 逗号分隔 ??
  • @BLUEPIXY 我认为是 char ','
  • 我认为你需要输出的字符串,它不在锯齿状数组中。
  • @noobatrilla int** 是指真正的 2D 阵列(如 int array[3][4];)吗?

标签: c arrays csv multidimensional-array char


【解决方案1】:

我认为您需要的是字符串,而不是二维数组。
通过实现一个简单扩展的字符串,您可以像写入标准输出一样写入字符串。

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

typedef struct char_vec {
    char *v;
    size_t capacity;
    size_t used;
} sstream;

sstream *ss_new(void);
void ss_free(sstream *ss);
void ss_putc(sstream *ss, char ch);
void ss_puts(sstream *ss, char *str);

int main(void){
    int rows = 3;
    int cols = 4;
    int **array = malloc(rows * sizeof(*array));
    for(int r = 0; r < rows; ++r){
        array[r] = malloc(cols * sizeof(**array));
    }
    //set values
    memcpy(array[0], (int[]){1,2,3,4}, cols * sizeof(**array));
    memcpy(array[1], (int[]){5,6,7,8}, cols * sizeof(**array));
    memcpy(array[2], (int[]){9,3,2,1}, cols * sizeof(**array));

    //print original array
    for(int r = 0; r < rows; ++r){
        for(int c = 0; c < cols; ++c){
            if(c)
                putchar(' ');
            printf("%d", array[r][c]);
        }
        puts("");
    }
    //make string of output
    char temp[32];
    sstream *ss = ss_new();
    ss_putc(ss, '[');
    for(int r = 0; r < rows; ++r){
        if(r)
            ss_putc(ss, ',');
        snprintf(temp, sizeof(temp), "['%d'", r + 1);//0'th index is represented as the row number
        ss_puts(ss, temp);
        for(int c = 0; c < cols; ++c){
            snprintf(temp, sizeof(temp), ",'%d'", array[r][c]);
            ss_puts(ss, temp);
        }
        ss_putc(ss, ']');
    }
    ss_putc(ss, ']');
    ss_putc(ss, '\0');

    puts(ss->v);
    ss_free(ss);

    //deallocate array
    for(int r = 0; r < rows; ++r)
        free(array[r]);
    free(array);
    return 0;
}

sstream *ss_new(void){
    sstream *ss = malloc(sizeof(*ss));
    ss->capacity = 32;
    ss->used = 0;
    ss->v = malloc(ss->capacity);
    return ss;
}
void ss_free(sstream *ss){
    free(ss->v);
    free(ss);
}

void ss_putc(sstream *ss, char ch){
    ss->v[ss->used++] = ch;
    if(ss->used == ss->capacity){
        char *temp = realloc(ss->v, ss->capacity += 32);
        if(!temp){
            ss_free(ss);
            fprintf(stderr, "fail realloc at %s\n", __func__);
            exit(EXIT_FAILURE);
        }
        ss->v = temp;
    }
}

void ss_puts(sstream *ss, char *str){
    while(*str)
        ss_putc(ss, *str++);
}

【讨论】:

  • 谢谢!谢谢!在与这么多人交谈之后,你让我看到了光明。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
相关资源
最近更新 更多