2010-05-13 11 views
11

Ich versuche, alle mehrere Leerzeichen in einem Text mit einem Leerzeichen zu ersetzen. Dies sollte eine sehr einfache Aufgabe sein, aber aus irgendeinem Grund gibt es ein anderes Ergebnis zurück als erwartet. Ich habe die Dokumente auf dem NSScanner gelesen und es scheint, als ob es nicht richtig funktioniert!Seltsames Verhalten von NSScanner auf einfache Leerzeichen Entfernung

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:@" "]; 
    } 

} 

Aber aus irgendeinem Grund das Ergebnis ist @"ThisisatestofNSScanner!" statt @"This is a test of NSScanner !".

Wenn Sie die Kommentare lesen und was jede Zeile zu erreichen, sollte es scheint einfach genug !? scanUpToCharactersFromSet sollte den Scanner stoppen, sobald er auf Leerzeichen trifft. scanCharactersFromSet sollte dann den Scanner über den Whitespace bis zu den Nicht-Whitespace Zeichen fortschreiten. Und dann geht die Schleife bis zum Ende weiter.

Was bin ich fehlt oder nicht zu verstehen?

Antwort

22

Ah, ich es herausgefunden! Standardmäßig überspringt der NSScanner Leerzeichen!

Stellt sich heraus, die Sie gerade charactersToBeSkipped-nil gesetzt haben:

[scanner setCharactersToBeSkipped:nil]; 
+1

Die Dokumentation garantiert nicht, dass 'nil' dort arbeiten werden; Es ist sicherer, stattdessen ein leeres NSCharacterSet-Objekt zu verwenden. Eine Möglichkeit, eine zu erstellen, wäre '[NSCharacterSet characterSetWithRange: (NSRange) {'', 0}]'. –

+2

Sieht aus wie 'nil' in Ordnung ist jetzt nach der [Dokumentation] (http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSScanner_Class/Reference/Reference.html#// apple_ref/occ/instm/NSScanner/setCharactersToBeSkipped :). 'skipSet - Die Zeichen, die beim Scannen nach einer Wertdarstellung ignoriert werden sollen. Pass nil, um keine Zeichen zu ignorieren. – christophercotton

+0

Großartig, danke dafür, guter Platz! –