2012-04-11 25 views
8

Actualmente estoy escribiendo un cargador de OBJ de onda de onda en Objective-C y estoy tratando de averiguar cómo analizar datos de un NSString de una manera similar a la función sscanf() en C.Equivalente de Sscanf en Objective-C

archivos OBJ definen caras en x, y, z tripletes de vértices, coordenadas de textura, y normales, tales como:

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

las que no estoy preocupado por las coordenadas de textura en el momento actual. En C, una forma fácil de analizar esta línea sería una sentencia como:

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

Obviamente, NSStrings no se puede utilizar en un sscanf() sin antes convertirlos en una cadena de estilo C, pero Me pregunto si hay una manera más elegante de realizar esto sin hacer tal conversión.

Respuesta

9

La clase NSScanner puede analizar números en cadenas, aunque no se puede utilizar como reemplazo directo para sscanf.

Editar: aquí hay una manera de usarlo. También puede poner / en la lista de caracteres que se omitirán.

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

para ir de un NSString a un C-String (char *), utilice

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

Alternativamente,

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

proporcionar acceso a la función sscanf().

Para ir a la inversa, utilice

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

O

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

Desde un punto de vista ObjC pura, NSScanner proporciona los -scanInteger o -scanFloat métodos para tirar enteros y flotadores de una cadena.

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