例如,外部 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)
我建议将你的字符串变成合适的切片。例如,使用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)
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)