如何在 Zig 中比较两个以零结尾但长度不同的字符串?

sno*_*h09 1 zig

例如,外部 C 库返回包含空终止字符串的固定大小缓冲区。

比较这两个缓冲区的 strcmp() 等效项是什么?std.mem.eql失败是因为它们的大小不同。

var string1: [1024]u8 = undefined;
@memset(&string1, 0);
@memcpy(string1[0..3], "foo");

var string2 = "foo";

var result = std.mem.eql(u8, &string1, string2);
try std.testing.expect(result);
Run Code Online (Sandbox Code Playgroud)

sig*_*god 5

我建议将你的字符串变成合适的切片。例如,使用std.mem.len

var buffer: [1024]u8 = undefined;
@memset(&buffer, 0);
@memcpy(buffer[0..3], "foo");

const length = std.mem.len(@as([*:0]u8, @ptrCast(&buffer)));
var string1 = buffer[0..length];
var string2 = "foo";

const result = std.mem.eql(u8, string1, string2);
try std.testing.expect(result);
Run Code Online (Sandbox Code Playgroud)

或更好,std.mem.span

var string1 = std.mem.span(@as([*:0]u8, @ptrCast(&buffer)));
Run Code Online (Sandbox Code Playgroud)

或者std.mem.sliceTo

var string1 = std.mem.sliceTo(@as([*:0]u8, @ptrCast(&buffer)), 0);
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道不需要多次使用该字符串并且想要“优化”,那么您可以使用std.mem.orderZ

var buffer: [1024]u8 = undefined;
@memset(&buffer, 0);
@memcpy(buffer[0..3], "foo");

var string1 = @as([*:0]u8, @ptrCast(&buffer));
var string2 = "foo";

const result = std.mem.orderZ(u8, string1, string2);
try std.testing.expect(result == .eq);
Run Code Online (Sandbox Code Playgroud)