You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中以表格格式打印SQLite数据表

在C语言中打印带表格结构的SQLite查询结果

默认SQLite的callback函数输出的键值对格式确实太占空间,也没有表格的视觉结构。这里有个简单直接的方法,能输出规整的表格:

实现思路

  1. 第一次触发回调时,先获取列名,同时计算每列的初始宽度(以列名长度为准)
  2. 打印表头,再打印分隔线
  3. 后续每一行回调时,动态调整列宽(如果当前行内容比列名更长),然后对齐打印该行内容

完整代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:37:50