文章出處

控制臺表格輸出需求

在研發工具時,尤其是一些服務后臺管理性質的工具時,經常會遇到使用控制臺進行命令行方式操作的需求,在控制臺使用表格將一些結果有組織地反饋給工具使用者,是一個必要的功能,本文將給出一個用于實現控制臺輸出表格樣式格式化的C語言代碼,希望可以幫助到有此方面需求的小伙伴們。

C語言實現

table.h定義表格結構體和format_table方法實現表格樣式格式化:

#include #include #include #include typedef struct TABLE {  unsigned int row_num;  unsigned int col_num;  unsigned int *col_max_width;  char ***content;} table;extern void format_table(table *t, char *formated_out);

通過table 設置表格的行數、列數以及對象行列索引的文本數據,formated_out為格式化完成的字符串。

table.c實現表格樣式格式化邏輯:

#include "table.h"#define CORNER_FLAG "+"#define ROW_LINE "-"#define COL_PADDING " "#define COL_LINE "|"/*** 計算在控制臺中輸出的字符串長度* str 字符串**/static int str_len(unsigned char *str){  int len = 0;  int offset = 2;  int word_len = strlen(str);  int i = 0;  for(i; i < word_len; i++){    if(str[i] < 128){      len += 1;    } else {      len += 2;      i += offset;    }  }  return len;}/*** 生成表格行邊* col_width 表格的列寬* col_num 表格列數* edge 保存行邊字符串**/static void make_edge(const unsigned int *col_width, const unsigned int col_num, char *edge){  memset(edge, 0 ,sizeof(edge));  strcat(edge, CORNER_FLAG);  int col_line_counter;  int row_line_counter;  for( col_line_counter = 0; col_line_counter < col_num; col_line_counter++ ){      strcat(edge, ROW_LINE);      for( row_line_counter = 0; row_line_counter < col_width[col_line_counter]; row_line_counter++ ){        strcat(edge, ROW_LINE);      }      strcat(edge, ROW_LINE);      strcat(edge, CORNER_FLAG);  }  strcat(edge, "\n");}/*** 根據表格一列的寬度值,求出該列中最大的寬度* col_width 指向一列所有寬度值數組的指針* row_num 表格行數* return 最大寬度值**/static int get_max_col_width(int *col_width, const unsigned int row_num){  int max_col_width = 0;  int i = 0;  for(i; i < row_num; i++){    if( max_col_width < col_width[i]){      max_col_width = col_width[i];    }  }  return max_col_width;}/*** 根據表格列的寬度,求出每列最大的寬度* col_width 指向表格所有列寬度二維數組的指針* row_num 表格行數* col_num 表格列數* max_col_width 指向table結構體中的col_max_width的指針,用于保存表格每列最大的寬度**/static void get_max_col(int **col_width, const unsigned int row_num, const unsigned int col_num, int *max_col_width){  int i;  int j;  for(i = 0; i < col_num; i++){    int max_width[ row_num ];    for(j = 0; j < row_num; j++){      max_width[j] = *((int *)col_width + (j * col_num) + i);    }    max_col_width[i] = get_max_col_width(max_width, row_num);  }}/*** 得到表格中所有列的寬度值* t 指向表格結構體的指針* col_width 指向表格所有列寬度二維數組的指針,用于保存所有寬度值**/static void get_col_width(table *t, int **col_width){  int i = 0;  int j;  for(i; i < t->row_num; i++){    for(j = 0; j < t->col_num; j++){      *((int *)col_width + i * t->col_num + j) = str_len(t->content[i][j]);    }  }}/*** 設置table結構體中col_max_width* t 指向表格結構體的指針**/static void set_table_col_max_width(table *t){  int col_width[t->row_num][t->col_num];  get_col_width(t, (int **)col_width);  get_max_col((int **)col_width, t->row_num, t->col_num, t->col_max_width);}/*** 得到表格的總寬* t 指向表格結構體的指針**/static int get_table_width(table *t){  int col_padding_width = 2 * t->col_num;  int col_line_width = t->col_num + 1;  int col_width = 0;  int i;  for(i = 0; i < t->col_num; i++){    col_width += t->col_max_width[i];  }  return col_line_width + col_padding_width + col_width;}/*** 設置格式化表格中的空格* str 保存的字符串* space_num 空格的數量**/static void set_space_txt(char *str, const unsigned int space_num){  int i;  for(i = 0; i < space_num; i++){    strcat(str, " ");  }}/*** 生成表格行邊* row_id 行id* t 指向表格結構體的指針* row_txt 格式化輸出的表格行邊字符串**/static void make_row(const unsigned int row_id, table *t, char *row_txt){  int i;  memset(row_txt, 0, sizeof(row_txt));  strcat(row_txt, COL_LINE);  for(i = 0; i < t->col_num; i++){    strcat(row_txt, COL_PADDING);    int word_len = str_len(t->content[row_id][i]);    strcat(row_txt, t->content[row_id][i]);    set_space_txt(row_txt, t->col_max_width[i] - word_len);    strcat(row_txt, COL_PADDING);    strcat(row_txt, COL_LINE);  }}/*** 格式化表格方法* t 指向表格結構體的指針* formated_out 格式化輸出字符串**/void format_table(table *t, char *formated_out){  set_table_col_max_width(t);  int col_width = get_table_width(t);  char row_txt[col_width + t->col_num];  int i;  make_edge(t->col_max_width, t->col_num, row_txt);  strcat(formated_out, row_txt);  for( i = 0; i < t->row_num; i++){    make_row(i, t, row_txt);    strcat(formated_out, row_txt);    strcat(formated_out, "\n");    make_edge(t->col_max_width, t->col_num, row_txt);    strcat(formated_out, row_txt);  }}

實現效果

int main(){    table t;    t.row_num = 5;    t.col_num = 3;    t.col_max_width = (int *)malloc(sizeof(int) * t.col_num);    t.content = (char ***)malloc(sizeof(char **) * t.row_num);    t.content[0] = (char **)malloc(sizeof(char *) * t.col_num);    t.content[1] = (char **)malloc(sizeof(char *) * t.col_num);    t.content[2] = (char **)malloc(sizeof(char *) * t.col_num);    t.content[3] = (char **)malloc(sizeof(char *) * t.col_num);    t.content[4] = (char **)malloc(sizeof(char *) * t.col_num);    t.content[0][0] = "AAAAAAAAAAAAAAAAA";    t.content[0][1] = "test";    t.content[0][2]= "BB";    t.content[1][0] = "2";    t.content[1][1] = "CCCCCCCCCCCCCCCCCCCCCCCCC";    t.content[1][2]= "測試";    t.content[2][0] = "3";    t.content[2][1] = "EEEEEEEEEEEEEE";    t.content[2][2] = "FFFFFFFFFFFFFFF測試FFFFFFF";    t.content[3][0] = "GGGGGGGGGGGGGGGG";    t.content[3][1] = "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH";    t.content[3][2]= "III";    t.content[4][0] = "GGGGGGGGGGGGGGG";    t.content[4][1] = "KKKKKKKKKKKKKKKKKKKK";    t.content[4][2] = "LLLLLLLLLLLLLLLLLLLLLLLLL";    char formated_out[2048];    memset(formated_out, 0, 2048);    format_table(&t, formated_out);    printf("%s", formated_out);    free(t.col_max_width);    free(t.content[0]);    free(t.content[1]);    free(t.content[2]);    free(t.content[3]);    free(t.content[4]);    free(t.content);    return 0;}

控制臺輸出表格樣式效果:

C語言實現控制臺輸出表格樣式格式化

就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/63507.html

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()