strchr в объективе C? - PullRequest
       6

strchr в объективе C?

0 голосов
/ 01 апреля 2010

Я пытаюсь написать эквивалент strchr, но с NSStrings ... У меня сейчас есть это:

Boolean nsstrchr(NSString* s, char c)
{
    NSString *tmps = [NSString stringWithFormat: @"%c", c];
    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString: tmps];
    NSRange rg = [s rangeOfCharacterFromSet: cSet];
    return rg.location != NSNotFound;
}

Это кажется излишне сложным ... Есть ли способ сделать это (предпочтительно, тот, который не включает превращение строки NSString в строку cstring, которая удваивает время выполнения, или сам записывает ее, используя characterAtIndex: ... отсутствует какой-то очевидный метод в описании NSString?

Ответы [ 4 ]

2 голосов
/ 01 апреля 2010

KennyTM уже отметил (в комментарии), что вы можете использовать -[NSString rangeOfString:] вместо -[NSString rangeOfCharacterFromSet]. Я не хочу украсть его полезный ответ, но я хотел бы отметить, что вы можете поместить его в категорию на NSString, чтобы упростить его использование:

@interface NSString (AdditionalStringOps)
- (BOOL) containsCharacter:(char) c;
@end

@implementation NSString (AdditionalStringOps)

- (BOOL) containsCharacter:(char) c
{
    NSString *tmp = [NSString stringWithFormat:@"%c", c];
    return [self rangeOfString:tmp].location != NSNotFound;
}

@end

И тогда вы можете использовать его так:

if ([myString containsCharacter:'A']) {
    // Do stuff...
}
0 голосов
/ 01 апреля 2010
Boolean nsstrchr(NSString* s, char c)
{
    NSString *tmps = [NSString stringWithFormat: @"%c", c];
    NSRange rg = [s rangeOfString: tmps];
    return rg.location != NSNotFound;
}
0 голосов
/ 01 апреля 2010

Несколько упрощений.

  1. Используйте [s rangeOfString:tmps] для исключения набора символов.
  2. Набор символов можно создать с помощью [NSCharacterSet characterSetWithRange:NSMakeRange(c, 1)], поэтому вам не нужно создавать tmps
  3. strchr([s UTF8String], c) - при условии, что c является символом ASCII, и возвращенный указатель не будет выходить из функции (есть риск, что указатель станет зависшим).
0 голосов
/ 01 апреля 2010

Как уже упоминалось @KennyTM, используйте rangeOfString:. Если вам действительно нужно иметь дело с вещами на уровне char, вы можете вытащить char* через -UTF8String (или -cStringUsingEncoding:), а затем искать там своего персонажа, как и на любом другом char* (возможно, используя strchr).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...