【问题标题】:Comparing strings is giving false in Objective-C在 Objective-C 中比较字符串是错误的
【发布时间】:2020-01-22 07:49:12
【问题描述】:

我正在使用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了吗?

【问题讨论】:

  • 看来您的问题不在于比较字符串。这是使用[[NSString alloc] initWithCharacters:&uchar length:ucharLen] 并没有得到预期的结果。您应该更新您的问题,显示用于创建字符串的所有相关代码。
  • @rmaddy 是的,问题在于初始化程序中的长度。我已经更新了问题。
  • 知道了。 initWithCharacters: 采用 C 数组。

标签: objective-c nsstring


【解决方案1】:

问题在于:

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

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

因此,生成的字符串包含两个字符 - 一个是您真正想要的字符,另一个是恰好位于该内存地址的随机垃圾。

只需硬编码 1:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多