# tank_printf **Repository Path**: X1aSheng/tank_printf ## Basic Information - **Project Name**: tank_printf - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-11 - **Last Updated**: 2026-08-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tank_printf 独立轻量字符串格式化器组件(零 libc 依赖),前身为 elog 内置的 `mini_printf`。 ## 特性 - **零 libc 依赖**:完全自实现整数转换与格式解析,不调用 `vsnprintf`/`vfprintf`,替代 libc printf 家族,省 ~6KB ROM(Keil libc vsnprintf 含浮点支持)。 - **原地解析**:单遍扫描格式串,不分配内存,适合中断/深调用上下文。 - **宽度/对齐**:支持 `%5d`、`%-5d`、`%05d`、`%10s` 等(v1.1 新增)。 - **64 位整数**:支持 `%lld`/`%llu`/`%llx`。 ## 支持格式 | 格式 | 说明 | | ---- | ---- | | `%d` / `%ld` | 有符号 32 位十进制 | | `%lld` | 有符号 64 位十进制 | | `%u` / `%lu` | 无符号 32 位十进制 | | `%llu` | 无符号 64 位十进制 | | `%x` / `%lx` | 无符号 32 位十六进制(大写) | | `%llx` | 无符号 64 位十六进制(大写) | | `%s` | 字符串(NULL 显示 `(null)`) | | `%c` | 单个字符 | | `%%` | 字面百分号 | > 不支持:`%f/%e/%g`(浮点)、`%p`、`%n`、精度 `.N`、`+`/空格/`#` 标志、小写十六进制。 > 浮点数请用定点整数拆分(乘 10^N → 整数/余数)。 ## API ```c int32_t tank_vsnprintf(char* buf, size_t size, const char* fmt, va_list args); int32_t tank_printf (char* buf, size_t size, const char* fmt, ...); ``` - 与 libc `vsnprintf` 兼容:最多写 `size-1` 字节 + 结尾 `'\0'`。 - 返回「应写入的字符数」(不含 `'\0'`);截断时返回大于 `size-1` 的值。 - `buf` 或 `fmt` 为 NULL 时返回 0。 ## 用法示例 ```c char buf[128]; tank_printf(buf, sizeof(buf), "%5d | %-10s | %08x", 42, "ok", 0xAB); // -> " 42 | ok | 000000AB" ``` ## 构建与测试 ```bat build.bat test REM 编译并运行单元测试(生成时间戳日志) build.bat clean make test REM 或使用 Makefile ``` ## 集成 - **elog**:`elog_config.h` 中 `ELOG_USE_TANK_PRINTF=1` 启用内置格式化器。 - **f407ve-flash**:`uart_printf.c` 复用 `tank_vsnprintf`,覆盖 rsh 的 weak 默认,丢弃 libc printf。 ## 目录 ``` tank_printf/ ├── tank_printf.h # 模块头 ├── tank_printf.c # 模块实现 ├── tank_printf_test.c # 单元测试 ├── Makefile / build.bat # 构建脚本 └── docs/ # 设计文档 ```