2010-05-13 11 views
11

Sto provando a sostituire tutti gli spazi bianchi multipli in un testo con un singolo spazio. Questo dovrebbe essere un compito molto semplice, tuttavia per qualche motivo restituisce un risultato diverso dal previsto. Ho letto i documenti su NSScanner e sembra che non funzioni correttamente!Strano comportamento di NSScanner sulla semplice rimozione di spazi bianchi

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

} 

Ma per qualche motivo il risultato è @"ThisisatestofNSScanner!" invece di @"This is a test of NSScanner !".

Se si leggono i commenti e ciò che ogni riga dovrebbe raggiungere sembra abbastanza semplice !? scanUpToCharactersFromSet dovrebbe arrestare lo scanner nello stesso modo in cui incontra spazi bianchi. scanCharactersFromSet dovrebbe quindi far avanzare lo scanner oltre gli spazi bianchi fino ai caratteri non bianchi. E poi il ciclo continua fino alla fine.

Cosa mi manca o non capisco?

risposta

22

Ah, l'ho capito! Per impostazione predefinita, NSScanner salta gli spazi bianchi!

scopre che basta impostare charactersToBeSkipped-nil:

[scanner setCharactersToBeSkipped:nil]; 
+1

La documentazione non garantisce che 'quelle negative funzionerà là; è più sicuro utilizzare invece un oggetto NSCharacterSet vuoto. Un modo per crearne uno sarebbe '[NSCharacterSet characterSetWithRange: (NSRange) {'', 0}]'. –

+2

Sembra che 'nil' stia bene ora secondo la [documentazione] (http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSScanner_Class/Reference/Reference.html#// apple_ref/occ/instm/NSScanner/setCharactersToBeSkipped :). 'skipSet - I caratteri da ignorare durante la scansione di una rappresentazione di valore. Passa a zero per non ignorare alcun personaggio. » – christophercotton

+0

Ottimo, grazie, buon posto! –