9

私は現在、Objective-C でウェーブフロント OBJ ローダーを作成しており、C の sscanf() 関数と同様の方法で NSString からデータを解析する方法を見つけようとしています。

OBJ ファイルは、次のような頂点、テクスチャ座標、および法線の x、y、z トリプレットで面を定義します。

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]);

明らかに、最初に C スタイルの文字列に変換せずに sscanf() で NSStrings を使用することはできませんが、そのような変換を行わずにこれを実行するためのよりエレガントな方法があるかどうか疑問に思っています。

4

2 に答える 2

9

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

編集:これを使用する1つの方法があります。/スキップする文字のリストに を入れることもできます。

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++;
}
于 2012-04-11T04:06:54.320 に答える
7

NSString から C-String (char *) に移動するには、次を使用します。

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 は文字列から int と float を引き出す-scanIntegerorメソッドを提供します。-scanFloat

NSScanner *aScanner = [NSScanner scannerWithString:string];
[aScanner scanInteger:anInteger];
于 2012-04-11T04:10:00.980 に答える