Сравнение строк дает ложь в Objective-C - PullRequest
0 голосов
/ 21 сентября 2019

Я сравниваю две строки, используя метод isEqual, и он дает NO.

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

trie.name - это строка, инициализированная с использованием [[NSString alloc] initWithCharacters:&uchar length:ucharLen], где uchar - это unichar.string - это постоянная строка @"N".Я проверил значения хэша, и оба отличаются.Я не уверен, почему создание строки с использованием другого инициализатора дает разные хэш для одного и того же значения строки.В этом случае, как проверить равенство строк?

Пожалуйста, смотрите прикрепленный скриншот переменных отладки.

string equal error


В настоящее время я использую код:

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 в этом случае?

1 Ответ

2 голосов
/ 21 сентября 2019

Проблема с:

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...