2012-04-11 11 views
8

Attualmente sto scrivendo un caricatore OBJ fronte d'onda in Objective-C e sto cercando di capire come analizzare i dati da un NSString in modo simile alla funzione sscanf() in C.Equivalente Sscanf in Objective-C

file OBJ definiscono facce in x, y, z triplette di vertici, coordinate texture, e normali quali:

f 1.43//2.43 1.11//2.33 3.14//0.009 

io non sono preoccupato coordinate texture al momento attuale. In C, un modo semplice per analizzare questa linea sarebbe una dichiarazione come:

sscanf(buf, "f %d//%d %d//%d %d//%d", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]); 

Ovviamente, NSStrings non può essere utilizzato in uno sscanf() senza prima convertirli in una stringa in stile C, ma io Mi chiedo se c'è un modo più elegante per eseguire questo senza fare una tale conversione.

risposta

9

La classe NSScanner può analizzare i numeri nelle stringhe, sebbene non possa essere utilizzata come sostituzione drop-in per sscanf.

Modifica: ecco un modo per usarlo. È anche possibile inserire / nell'elenco di caratteri da saltare.

float temp[6]; 
NSString *objContent = @"f 1.43//2.43 1.11//2.33 3.14//0.009"; 
NSScanner *objScanner = [NSScanner scannerWithString:objContent]; 

// Skip the first character. 
[objScanner scanString:@"f " intoString:nil]; 

// Read the numbers. 
NSInteger index=0; 
BOOL parsed=YES; 
while ((index<6)&&(parsed)) 
{ 
    parsed=[objScanner scanFloat:&temp[index]]; 
    // Skip the slashes. 
    [objScanner scanString:@"//" intoString:nil]; 

    NSLog(@"Parsed %f", temp[index]); 
    index++; 
} 
5

Per passare da un NSString ad un C-stringa (char *), utilizzare

NSString *str = @"string"; 
const char *c = [str UTF8String]; 

alternativa,

NSString *str = @"Some string"; 
const char *c = [str cStringUsingEncoding:NSUTF8StringEncoding]; 

Fornire accesso alla funzione sscanf().

Per andare nella direzione opposta, utilizzare

const *char cString = "cStr"; 
NSString *string = [NSString stringWithUTF8String:cString]; 

O

const *char cString = "cStr"; 
NSString *myNSString = [NSString stringWithCString:cString encoding:NSASCIIStringEncoding]; 

Dal punto di vista objC pura, NSScanner fornisce i -scanInteger o -scanFloat metodi per tirare int e galleggia fuori di una stringa.

NSScanner *aScanner = [NSScanner scannerWithString:string]; 
[aScanner scanInteger:anInteger];