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