NSScanner在简单的空白移除上的奇怪行为

Mic*_*all 11 iphone cocoa objective-c nsscanner

我试图用一个空格替换某些文本中的所有多个空格.这应该是一个非常简单的任务,但由于某种原因,它返回的结果与预期不同.我已经阅读了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:@" "];
    }

}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,结果@"ThisisatestofNSScanner!"不是@"This is a test of NSScanner !".

如果你仔细阅读评论以及每行应该达到的目的,这看起来很简单!?scanUpToCharactersFromSet应该在遇到空白时停止扫描仪.scanCharactersFromSet然后应该使扫描程序通过空格直到非空白字符.然后循环继续到最后.

我错过了什么或不理解?

Mic*_*all 22

啊,我明白了!默认情况下,NSScanner会跳过空格!

事实证明你必须设置charactersToBeSkippednil:

[scanner setCharactersToBeSkipped:nil];
Run Code Online (Sandbox Code Playgroud)

  • 根据[文档](http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSScanner_Class/Reference/Reference.html#//apple_ref看起来``nil`看起来很好/ occ/instm/NSScanner/setCharactersToBeSkipped :).`skipSet - 扫描值表示时要忽略的字符.传递零以不忽略任何字符 (2认同)