2012-04-11 11 views
8

Objective-Cで波面OBJローダーを作成していますが、NSStringのデータをCのsscanf()関数と同様の方法で解析する方法を見つけようとしています。 Iテクスチャ心配はないですSscanf Objective-Cと同等

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

現時点における座標:

OBJファイルは、次のようなX、Yにおける顔、頂点、テクスチャ座標のZトリプレット、及び法線を定義します。明らかに

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

、NSStringsは最初のCスタイルの文字列に変換することなく、のsscanf()で使用することはできませんが、I:Cでは、この行を解析する簡単な方法は、文のようなことでしょうこのような変換をせずにこれを行うよりエレガントな方法があるのだろうかと思っています。

答えて

9

NSScannerクラスは、sscanfのドロップイン置換として使用することはできませんが、文字列の数値を解析できます。

を編集するには、こちらの方法があります。スキップする文字のリストに/を入れることもできます。 Cストリング(チャー*)へのNSStringから移動する

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 *str = @"Some string"; 
const char *c = [str cStringUsingEncoding:NSUTF8StringEncoding]; 

はのsscanf()関数へのアクセスを提供

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

を使用します。

、他の道を行く、純粋にObjC観点から

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

それとも

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

を使用するには、NSScannerはint型を引っ張って-scanIntegerまたは-scanFloat方法を提供し、文字列の外に浮かびます。

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