如何在C语言中以表格格式打印SQLite数据表
在C语言中打印带表格结构的SQLite查询结果
默认SQLite的callback函数输出的键值对格式确实太占空间,也没有表格的视觉结构。这里有个简单直接的方法,能输出规整的表格:
实现思路
- 第一次触发回调时,先获取列名,同时计算每列的初始宽度(以列名长度为准)
- 打印表头,再打印分隔线
- 后续每一行回调时,动态调整列宽(如果当前行内容比列名更长),然后对齐打印该行内容
完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlite3.h> typedef struct { int col_num; int *col_widths; int first_run; } TablePrinter; int table_callback(void *data, int argc, char **argv, char **col_names) { TablePrinter *printer = (TablePrinter*)data; if (printer->first_run) { // 初始化列宽度,先取列名的长度 printer->col_num = argc; printer->col_widths = malloc(argc * sizeof(int)); for (int i = 0; i < argc; i++) { printer->col_widths[i] = strlen(col_names[i]); } // 检查第一行内容,更新列宽 for (int i = 0; i < argc; i++) { if (argv[i] && strlen(argv[i]) > printer->col_widths[i]) { printer->col_widths[i] = strlen(argv[i]); } } // 打印表头 for (int i = 0; i < argc; i++) { printf("%-*s | ", printer->col_widths[i], col_names[i]); } printf("\n"); // 打印分隔线 for (int i = 0; i < argc; i++) { for (int j = 0; j < printer->col_widths[i]; j++) printf("-"); printf("---"); } printf("\n"); // 打印第一行数据 for (int i = 0; i < argc; i++) { printf("%-*s | ", printer->col_widths[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); printer->first_run = 0; } else { // 动态更新列宽(如果当前行内容更长) for (int i = 0; i < argc; i++) { if (argv[i] && strlen(argv[i]) > printer->col_widths[i]) { printer->col_widths[i] = strlen(argv[i]); } } // 打印当前行 for (int i = 0; i < argc; i++) { printf("%-*s | ", printer->col_widths[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); } return 0; } int main() { sqlite3 *db; char *err_msg = NULL; int rc = sqlite3_open("your_database.db", &db); if (rc != SQLITE_OK) { fprintf(stderr, "打开数据库失败: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } TablePrinter printer = {0, NULL, 1}; rc = sqlite3_exec(db, "SELECT * FROM your_table", table_callback, &printer, &err_msg); if (rc != SQLITE_OK) { fprintf(stderr, "查询出错: %s\n", err_msg); sqlite3_free(err_msg); } free(printer.col_widths); sqlite3_close(db); return 0; }
补充说明
- 这个实现会自动适配每列的最长内容,保证表格对齐
- 遇到NULL值会显示为
NULL - 如果你的表内容长度固定,也可以简化代码,直接用固定宽度(比如把
%-*s改成%-12s),省去动态计算宽度的逻辑
内容的提问来源于stack exchange,提问作者wwillfred
相关产品推荐
相关产品推荐

