Ziglings 笔记 06: 字符串就是数组


揭开字符串的面纱

在完成了数组的练习后,Ziglings 紧接着带我进入了 字符串 (Strings) 的世界。

在很多高级语言(如 Python 或 Java)中,String 是一个复杂的对象。但在 Zig 中,它回归了本源:字符串不仅看起来像数组,它就是数组。

挑战:像操作数组一样操作字符串

这次的任务是处理 "stardust" 字符串,我们需要提取字符、重复字符串以及拼接字符串。

解决方案

这是我的代码实现:

const std = @import("std");

pub fn main() void {
    const ziggy = "stardust";

    // 1. 像访问数组一样获取第 5 个字符 'd' (索引 4)
    const d: u8 = ziggy[4];

    // 2. 使用数组重复操作符 '**' 生成 "ha ha ha "
    const laugh = "ha " ** 3;

    // 3. 使用数组连接操作符 '++' 拼接名字
    const major = "Major";
    const tom = "Tom";
    const major_tom = major ++ " " ++ tom;

    // 注意这里的打印格式:
    // {u} 用于打印字符,{s} 用于打印字符串
    std.debug.print("d={u} {s}{s}\n", .{ d, laugh, major_tom });
}

核心知识点总结

1. 字符串 = []u8

Zig 没有专门的 String 类型。字符串字面量本质上就是 u8(无符号8位整数/字节)的数组。 这意味着 "Hello"[_]u8{ 'H', 'e', 'l', 'l', 'o' } 在内存中的表现几乎是一样的。

2. 单引号与双引号的区别

这在 Zig 中非常严格:

  • 单引号 'A':代表一个字符(Character),它实际上是一个整数(u8)。
  • 双引号 "A":代表一个字符串(String),它是一个数组。

3. 格式化打印的奥秘

std.debug.print 中:

  • 如果我们直接打印字符 d{}),Zig 会打印出它的 ASCII 码整数值(100)。
  • 为了看到字符本身,我们需要使用 {u} (UTF-8) 或 {c} (Character) 格式说明符。
  • 打印字符串则始终使用 {s}

后续预告:既然字符串是数组,那如果我要处理真正的文本数据,会不会很麻烦?接下来的练习可能会带我们去探索更高级的字符串处理方式。