Вопрос по objective-c, cocoa – Эквивалент Sscanf в Objective-C

8

В настоящее время я пишу OBJ-загрузчик волнового фронта в Objective-C, и я пытаюсь выяснить, как анализировать данные из строки NSSt аналогично функции sscanf () в C.

Файлы OBJ определяют грани в тройках x, y, z вершин, текстурных координатах и нормалях, таких как:

<code>f 1.43//2.43 1.11//2.33 3.14//0.009
</code>

Я не обеспокоен текстурными координатами в текущий момент. В C простым способом разбора этой строки было бы следующее утверждение:

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

Очевидно, что NSStrings не могут быть использованы в sscanf () без предварительного их преобразования в строку в стиле C, но мне интересно, есть ли более элегантный способ выполнить это без выполнения такого преобразования.

Ваш Ответ

2   ответа
5

Чтобы перейти от строки NSS к строке C (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];
9

NSScanner Класс может анализировать числа в строках, хотя он не может использоваться в качестве замены sscanf.

EditВот один из способов его использования. Вы также можете положить/ в список символов, которые будут пропущены.

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++;
}

Похожие вопросы