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!
zig arraylist generalpurposeallocator
Commentami!