我目前正在Objective-C中编写一个wavefront 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()中使用,但我想知道是否有一种更优雅的方式来执行此操作而不进行这样的转换。
答案 0 :(得分: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++;
}
答案 1 :(得分:5)
要从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提供-scanInteger
或-scanFloat
方法来从字符串中提取整数和浮点数。
NSScanner *aScanner = [NSScanner scannerWithString:string];
[aScanner scanInteger:anInteger];