2012-04-11 40 views
8

Tôi hiện đang viết trình nạp OBJ dạng sóng trong Mục tiêu-C và tôi đang cố gắng tìm cách phân tích dữ liệu từ một NSString theo cách tương tự như hàm sscanf() trong C.Tương đương Sscanf trong mục tiêu-C

file OBJ xác định khuôn mặt trong x, y, z ba đỉnh, tọa độ texture, và normals như:

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

tôi không quan tâm đến kết cấu phối tại thời điểm hiện tại. Trong C, một cách dễ dàng để phân tích dòng này sẽ là một tuyên bố như:

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

Rõ ràng, NSStrings không thể được sử dụng trong một sscanf() mà không cần chuyển đổi chúng sang một chuỗi C-phong cách, nhưng tôi 'm tự hỏi nếu có một cách thanh lịch hơn để thực hiện điều này mà không làm một chuyển đổi như vậy.

Trả lời

9

Lớp NSScanner có thể phân tích cú pháp số trong chuỗi, mặc dù nó không thể được sử dụng làm thay thế thả cho sscanf.

Chỉnh sửa: đây là một cách để sử dụng. Bạn cũng có thể đặt / vào danh sách các ký tự bị bỏ qua.

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

Để đi từ một NSString một C-String (char *), sử dụng

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

Ngoài ra,

NSString *str = @"Some string"; 
const char *c = [str cStringUsingEncoding:NSUTF8StringEncoding]; 

Cung cấp truy cập vào các sscanf function().

Để đi theo con đường khác, sử dụng

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

Hoặc

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

Từ một quan điểm ObjC tinh khiết, NSScanner cung cấp -scanInteger hoặc -scanFloat phương pháp để kéo ints và nổi ra khỏi một chuỗi.

NSScanner *aScanner = [NSScanner scannerWithString:string]; 
[aScanner scanInteger:anInteger]; 
Các vấn đề liên quan