123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- //
- // ------------------------------------------------------------
- // TOP SECRET TOP SECRET TOP SECRET TOP SECRET TOP SECRET
- // ------------------------------------------------------------
- //
- // Are you ready for the THE TRUTH about Zig string literals?
- //
- // Here it is:
- //
- // @TypeOf("foo") == *const [3:0]u8
- //
- // Which means a string literal is a "constant pointer to a
- // zero-terminated (null-terminated) fixed-size array of u8".
- //
- // Now you know. You've earned it. Welcome to the secret club!
- //
- // ------------------------------------------------------------
- //
- // Why do we bother using a zero/null sentinel to terminate
- // strings in Zig when we already have a known length?
- //
- // Versatility! Zig strings are compatible with C strings (which
- // are null-terminated) AND can be coerced to a variety of other
- // Zig types:
- //
- // const a: [5]u8 = "array".*;
- // const b: *const [16]u8 = "pointer to array";
- // const c: []const u8 = "slice";
- // const d: [:0]const u8 = "slice with sentinel";
- // const e: [*:0]const u8 = "many-item pointer with sentinel";
- // const f: [*]const u8 = "many-item pointer";
- //
- // All but 'f' may be printed. (A many-item pointer without a
- // sentinel is not safe to print because we don't know where it
- // ends!)
- //
- const print = @import("std").debug.print;
- const WeirdContainer = struct {
- data: [*]const u8,
- length: usize,
- };
- pub fn main() void {
- // WeirdContainer is an awkward way to house a string.
- //
- // Being a many-item pointer (with no sentinel termination),
- // the 'data' field "loses" the length information AND the
- // sentinel termination of the string literal "Weird Data!".
- //
- // Luckily, the 'length' field makes it possible to still
- // work with this value.
- const foo = WeirdContainer {
- .data = "Weird Data!",
- .length = 11,
- };
- // How do we get a printable value from 'foo'? One way is to
- // turn it into something with a known length. We do have a
- // length... You've actually solved this problem before!
- //
- // Here's a big hint: do you remember how to take a slice?
- const printable = ???;
- print("{s}\n", .{printable});
- }
|