2012-04-11 68 views
8

我目前正在Objective-C中編寫一個波前OBJ加載器,我試圖弄清楚如何以類似於C中sscanf()函數的方式解析NSString中的數據。Sscanf等價於Objective-C

OBJ文件定義在X,Y面,頂點,紋理座標ž三胞胎和法線如:

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

我不關心質地在當前時刻的座標。在C語言中,一個簡單的方法來解析這條線將是一條語句,如:

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

顯然,NSString的不能在一個sscanf的(),而不首先將它們轉換成C風格的字符串使用,但我不知道是否有一種更優雅的方式來執行此操作而不進行此類轉換。

回答

9

NSScanner類可以解析字符串中的數字,儘管它不能用作sscanf的插入替換。

編輯:這裏有一個使用它的方法。您也可以將/放入要跳過的字符列表中。

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

要從一個NSString去一個C-字符串(字符*),使用

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

或者,

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

提供訪問的sscanf()函數。

走另外一條路,用

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

或者

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

從純ObjC的角度來看,NSScanner提供-scanInteger-scanFloat方法拉整型和浮點出一個字符串。

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