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 类型。