Concatenare le stringhe in Zig

Mattepuffo's logo
Concatenare le stringhe in Zig

Concatenare le stringhe in Zig

In Zig non esiste un tipo string speciale come in altri linguaggi.

In pratica una stringa è uno slice di bytes:

  • const[] u8 -> stringa immutabile
  • [] u8 -> stringa mutabile

Ecco perchè alcune delle operazioni più facili, tipo la concatenazione, richiede un minimo di operazioni in più.

In questo articolo vi propongo 4 metodi per farlo.

Considerate che sto usando la versione 0.15.2:

const std = @import("std");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    std.debug.print("\n=== CONCATENAZIONE STRINGHE IN ZIG ===\n\n", .{});

    // 1. CONCATENAZIONE A COMPILE-TIME
    std.debug.print("1. Compile-time (operatore ++):\n", .{});
    const saluto_statico = "Ciao" ++ " " ++ "mondo" ++ "!";
    std.debug.print("   Risultato: {s}\n\n", .{saluto_statico});

    // 2. CONCATENAZIONE A RUNTIME CON fmt.allocPrint
    std.debug.print("2. Runtime con fmt.allocPrint:\n", .{});
    const nome = "Marco";
    const eta = 25;
    const messaggio = try std.fmt.allocPrint(
        allocator,
        "Ciao {s}, hai {d} anni!",
        .{ nome, eta },
    );
    defer allocator.free(messaggio);
    std.debug.print("   Risultato: {s}\n\n", .{messaggio});

    // 3. CONCATENAZIONE A RUNTIME CON mem.concat
    std.debug.print("3. Runtime con mem.concat:\n", .{});
    const str1 = "Benvenuto";
    const str2 = "in";
    const str3 = "Zig";
    const parti = [_][]const u8{ str1, " ", str2, " ", str3, "!" };
    const concatenato = try std.mem.concat(allocator, u8, &parti);
    defer allocator.free(concatenato);
    std.debug.print("   Risultato: {s}\n\n", .{concatenato});

    // 4. BONUS: ARRAYLIST per concatenazioni incrementali
    std.debug.print("4. Bonus - ArrayList:\n", .{});
    var list = std.ArrayList(u8){
        .items = &[_]u8{},
        .capacity = 0,
    };
    defer list.deinit(allocator);

    try list.appendSlice(allocator, "Costruisco ");
    try list.appendSlice(allocator, "una stringa ");
    try list.appendSlice(allocator, "pezzo per pezzo");
    const risultato = list.items;
    std.debug.print("   Risultato: {s}\n\n", .{risultato});
}

Enjoy!


Condividi

Commentami!