Ziglings 笔记 99: 格式化大师 (Formatting)
强迫症的福音
在 Ziglings 的第 99 个练习中,我们探讨了 Formatting (格式化)。
在控制台输出中,没有什么比参差不齐的表格更让人难受的了。
C 语言有 printf("%3d"),Zig 也有类似的强大工具。通过简单的占位符语法,我们可以像排版工一样精准控制每一个字符的位置。
挑战:乘法表
我们需要打印一个 15x15 的乘法表。
为了让表格看起来整洁,每一列的数字必须垂直对齐。
已知的表头格式是 ---+(4个字符宽)。因此,我们的数字必须占用 3 个字符,再加上 1 个空格。
解决方案
我们需要修改内部循环的打印语句,使用 {d:>3} 来强制右对齐并占用 3 个字符宽度。
const std = @import("std");
const print = std.debug.print;
pub fn main() !void {
const size = 15;
// 打印表头... (省略)
// 打印每一行
for (0..size) |a| {
// 行首标签:右对齐,宽 2 位
print("{d:>2} |", .{a + 1});
for (0..size) |b| {
// 核心修复:
// d: 十进制整数
// >: 右对齐 (Right Align)
// 3: 宽度为 3
// 结果:" 1", " 10", "225"
print("{d:>3} ", .{(a + 1) * (b + 1)});
}
print("\n\n", .{});
}
}
核心知识点总结
1. 语法解剖
占位符 {d:>3} 可以拆解为:
- Specifier (类型):
d(整数)。还有s(字符串),c(字符),x(十六进制),e(科学计数法)。 - Alignment (对齐):
>(右对齐)。还有<(左对齐),^(居中)。 - Width (宽度):
3。保证输出至少占用这么多字符。
2. 更多花样
- 居中:
print("{s:*^10}", .{"Hi"})->****Hi**** - 前导零:
print("{d:0>4}", .{5})->0005 - 精度:
print("{d:.2}", .{3.14159})->3.14
3. 没有官方文档?
练习注释中提到 Zig 标准库文档还在完善中。目前学习格式化的最佳途径之一是直接阅读源码注释:lib/std/fmt.zig。这是 Zig “Read the Source” 文化的一种体现。
后续预告:我们已经掌握了基本的控制台输出。但是,我们如何处理那些可能不存在的值呢?在其他语言中这可能是 Null Pointer Exception 的来源。下一篇,我们将复习 Optional 类型。