Странное поведение NSScanner при простом удалении пробелов - PullRequest
11 голосов
/ 13 мая 2010

Я пытаюсь заменить все несколько пробелов в некотором тексте одним пробелом. Это должно быть очень простой задачей, однако по какой-то причине она возвращает результат, отличный от ожидаемого. Я прочитал документы на NSScanner и похоже, что он не работает должным образом!

NSScanner *scanner = [[NSScanner alloc] initWithString:@"This    is   a test of NSScanner   !"];
NSMutableString *result = [[NSMutableString alloc] init];
NSString *temp;
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
while (![scanner isAtEnd]) {

    // Scan upto and stop before any whitespace
    [scanner scanUpToCharactersFromSet:whitespace intoString:&temp];

    // Add all non whotespace characters to string
    [result appendString:temp];

    // Scan past all whitespace and replace with a single space
    if ([scanner scanCharactersFromSet:whitespace intoString:NULL]) {
        [result appendString:@" "];
    }

}

Но по какой-то причине результат равен @"ThisisatestofNSScanner!" вместо @"This is a test of NSScanner !".

Если вы прочитали комментарии и то, чего должна достичь каждая строка, это кажется достаточно простым !? scanUpToCharactersFromSet должен остановить сканер так же, как он сталкивается с пробелами. scanCharactersFromSet должен затем развернуть сканер за пробел до непробельных символов. И тогда цикл продолжается до конца.

Что я упускаю или не понимаю?

1 Ответ

22 голосов
/ 13 мая 2010

Ах, я понял это! По умолчанию NSScanner пропускает пробелы!

Оказывается, вам просто нужно установить charactersToBeSkipped на nil:

[scanner setCharactersToBeSkipped:nil];
...