Wil*_*ith 9 3d cocoa objective-c
我目前正在Objective-C中编写一个wavefront OBJ加载器,我试图弄清楚如何以类似于C中的sscanf()函数的方式解析NSString中的数据.
OBJ文件定义顶点,纹理坐标和法线的x,y,z三元组中的面,例如:
f 1.43//2.43 1.11//2.33 3.14//0.009
Run Code Online (Sandbox Code Playgroud)
我不关心当前时刻的纹理坐标.在C中,解析这一行的简单方法是声明如下:
sscanf(buf, "f %d//%d %d//%d %d//%d", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]);
Run Code Online (Sandbox Code Playgroud)
显然,NSStrings不能在没有首先将它们转换为C风格的字符串的情况下在sscanf()中使用,但我想知道是否有一种更优雅的方式来执行此操作而不进行这样的转换.
该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++;
}
Run Code Online (Sandbox Code Playgroud)
要从NSString转到C-String(char*),请使用
NSString *str = @"string";
const char *c = [str UTF8String];
Run Code Online (Sandbox Code Playgroud)
或者,
NSString *str = @"Some string";
const char *c = [str cStringUsingEncoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
提供对sscanf()函数的访问.
换句话说,使用
const *char cString = "cStr";
NSString *string = [NSString stringWithUTF8String:cString];
Run Code Online (Sandbox Code Playgroud)
要么
const *char cString = "cStr";
NSString *myNSString = [NSString stringWithCString:cString encoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)
从纯ObjC观点来看,NSScanner提供-scanInteger或-scanFloat方法来拉整型和浮点出的字符串的.
NSScanner *aScanner = [NSScanner scannerWithString:string];
[aScanner scanInteger:anInteger];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5422 次 |
| 最近记录: |