比较字符串在 Objective-C 中给出 false

Comparing strings is giving false in Objective-C

我正在使用 isEqual 方法比较两个字符串,它给出 NO.

if ([trie.name isEqual:string]) {
    isFound = YES;
    break;
}

trie.name 是使用 [[NSString alloc] initWithCharacters:&uchar length:ucharLen] 初始化的字符串,其中 ucharunicharstring 是一个常量字符串 @"N"。我检查了哈希值,两者都不同。我不确定为什么使用不同的初始值设定项创建字符串会为相同的字符串值提供不同的哈希值。在这种情况下,如何检查字符串是否相等?

请参阅调试变量的附加屏幕截图。


目前我使用的代码是:

NSString *string = @"Pirates";
unichar uchar = [string characterAtIndex:0];
size_t ucharLen = sizeof(uchar);
NSString *str = [[NSString alloc] initWithCharacters:&uchar length:ucharLen];
XCTAssertTrue([str isEqual:@"P"]);

如果我给 length: 作为 1,它可以正常工作。如何获得unichar的长度。在这种情况下,它会一直是 1 以便我可以硬编码 1 吗?

问题在于:

unichar uchar = [string characterAtIndex:0];
size_t ucharLen = sizeof(uchar);
NSString *str = [[NSString alloc] initWithCharacters:&uchar length:ucharLen];

您正在从单个 unichar 创建字符串,这意味着长度需要为 1。但是 sizeof(unichar) returns 2 因为 unichar 是一个 16 位(2 字节)的值所以你最终告诉字符串你传递的是 2 个字符,而不是 1.

因此生成的字符串包含两个字符 - 您实际想要的字符和恰好位于该内存地址的第二个随机垃圾位。

只需硬编码 1:

unichar uchar = [string characterAtIndex:0];
NSString *str = [[NSString alloc] initWithCharacters:&uchar length:1];