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

显然,如果不先将 NSStrings 转换为 C 风格的字符串,就不能在 sscanf() 中使用它们,但我想知道是否有更优雅的方法来执行此操作而不进行此类转换。

4

2 回答 2

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++;
}
于 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 提供了-scanIntegeror-scanFloat方法来从字符串中提取整数和浮点数。

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