文章出處
控制臺表格輸出需求
在研發工具時,尤其是一些服務后臺管理性質的工具時,經常會遇到使用控制臺進行命令行方式操作的需求,在控制臺使用表格將一些結果有組織地反饋給工具使用者,是一個必要的功能,本文將給出一個用于實現控制臺輸出表格樣式格式化的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;}
控制臺輸出表格樣式效果:
就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/63507.html
文章列表
全站熱搜