1

文字列( "G00 X0.0000 Y0.0000")があり、その内容を解析する必要があると仮定します。これが私のコードです:

NSCharacterSet *params = [NSCharacterSet characterSetWithCharactersInString:@"XY"];

//setup the scanner
NSScanner *scanner = [NSScanner scannerWithString:stringToBeScanned];
NSString *scanned = nil;

//scan the string
NSLog(@"%@", stringToBeScanned);
while ([scanner scanUpToCharactersFromSet:params intoString:&scanned]) {

    struct keypair code;
    code.key = [scanned characterAtIndex:0];
    code.value = [[scanned substringFromIndex:1] doubleValue];

    NSLog(@"--> %@ [%lu]= (%c, %.4f)", scanned, [scanner scanLocation], code.key, code.value);
}

そしてNSLogへの出力:

G00 X0.0000 Y0.0000 
--> G00  [4]= (G, 0.0000)

私のcharacterSetには「X」と「Y」の両方が含まれていますが、NSScannerが「X0.0000」でスキャンしない理由がわかりません-Yを見つけて、XからYまでのすべてをプルする必要があります理解。

scanLocationから、スキャナーがインデックス4で(正しく)停止していることがわかりますが、ループが続行しないか、falseと評価されます。スキャナーはループを続け、(characterSetから)区切り文字を見つけてデータを取得するべきではありませんか?

4

2 に答える 2

0

scanUpToCharactersFromSet:intoString:「X」までスキャン、スキャンした文字「G00」を表示します。

「X」はスキャンされないことに注意してください。メソッドを再度呼び出すと、次の文字( "X")を調べ、それがセット内の文字であることに気づき、スキャンを停止します。文字をスキャンしなかったため、。を返しますNO

「X」(または「Y」)をスキャンするにはscanCharactersFromSet:intoString:、同様に使用する必要があります。

于 2012-09-12T06:40:42.727 に答える
0

この問題を解決しました。基本的に、「コード」のリストとそれに続くそのコマンド/パラメータに関連付けられた値を含む文字列を受け取ります。各文字列にいくつかの異なる「コマンド」が含まれる場合もあれば、まったく含まれない場合もあります。重要なのは、scanCharactersFromSet:とscanUpToCharactersFromSet:を使用して、適切なペアリングをキャプチャし、非常に柔軟な状態を保ちながら文字列全体を解析することでした。少し醜いです、私は知っています。

これが私のコードです:

//setup the scanner
NSScanner *scanner = [NSScanner scannerWithString:[self stringByAppendingString:@"!"]];
NSCharacterSet *codeset = [NSCharacterSet characterSetWithCharactersInString:@"GMTFIJKPRSXYZ!"];
NSString *scanned = nil;
char codechar;

//perform the first scan
[scanner scanCharactersFromSet:codeset intoString:&scanned];
if (scanned)
    codechar = [scanned characterAtIndex:0];

//scan the string
while ([scanner scanUpToCharactersFromSet:codeset intoString:&scanned]) {
    struct keypair code;
    code.key = codechar;
    code.value = [scanned doubleValue];

    NSLog(@"--> (%c, %.4f)", code.key, code.value);

    //skip over the delimeter we encountered
    [scanner scanCharactersFromSet:codeset intoString:&scanned];
    if (scanned)
        codechar = [scanned characterAtIndex:0];

}
于 2012-09-13T00:25:41.087 に答える