NSScanner findet Buchstaben nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSScanner findet Buchstaben nicht

    Folgender Code dient als Grundlage meiner Frage.

    Quellcode

    1. - (NSArray *)variableIdentifiersInFormel:(NSString *)formel
    2. {
    3. NSScanner *scanner = [NSScanner scannerWithString:formel];
    4. NSCharacterSet *charactersToCount = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"]; // For example
    5. NSString *charactersFromString;
    6. if (!([scanner scanCharactersFromSet:charactersToCount intoString:&charactersFromString])) {
    7. // No characters found
    8. NSLog(@"No characters found");
    9. }
    10. NSMutableArray *stringBuffer = [NSMutableArray arrayWithCapacity:[charactersFromString length]];
    11. for (int i = 0; i < [charactersFromString length]; i++) {
    12. [stringBuffer addObject:[NSString stringWithFormat:@"%C", [charactersFromString characterAtIndex:i]]];
    13. }
    14. return stringBuffer;
    15. }
    Alles anzeigen


    Wenn ich nun aufrufe

    Quellcode

    1. [self variableIdentifiersInFormel:@"π * r²"];


    , ist die Ausgabe "No characters found" 8| :huh: ?(

    Jemand eine idee?

    Danke.
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • macmoonshine schrieb:

    Der Scanner sucht immer ab der aktuellen Stelle. das ist zu Beginn der Anfang der Zeichenkette, und da steht ein π.
    BTW: Hier ist ein sehr netter Artikel zum Parsen von Strings.


    Danke für den Link, werde ich mir auf jeden Fall mal ansehen.

    Für mich erklärt sich trotzdem nicht, so recht, wieso mein Scan-Ergebnis, also ''charactersFromString" später (null) ist. weild as 'r' müsste er doch trotz den Pi am begin finden oder nicht? :/
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Die Methode scanCharactersFromSet:intoString: scannt nur so lange Zeichen in intoString, wenn diese in dem übergebenen CharacterSet vorhanden sind. Da "π" in dem übergebenen CharacterSet nicht vorhanden ist, wird der Scan-Vorgang natürlich sofort beendet und der "Ergebnis-String", also intoString ist somit leer.

    Wenn Du einen Ergbnis-String bis zum Auftreten eines der Zeichen "abcdefghijklmnopqrstuvwxyz" haben möchtest, dann musst Du einen invertedSet CharacterSet verwenden, also z.B. so:

    Quellcode

    1. NSCharacterSet *charactersToCount = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"] invertedSet];


    Alternativ kannst Du natürlich die Methode scanUpToCharactersFromSet:intoString: verwenden. Diese scannt so lange Zeichen in intoString, wie diese nicht in dem übergebenen CharacterSet vorhanden sind. ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MCDan ()

  • macmoonshine schrieb:

    MCDan schrieb:

    Wenn Du einen Ergbnis-String bis zum Auftreten eines der Zeichen "abcdefghijklmnopqrstuvwxyz" haben möchtest, dann musst Du einen invertedSet CharacterSet verwenden, also z.B. so:

    Was spricht gegen scanUpToCharactersFromSet:intoString:?


    Damit ist mein Ergebnis dann "π * ", also genau der teil, den ich nicht haben will... :/
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Quellcode

    1. if ([scanner scanUpToCharactersFromSet:charactersToCount intoString:NULL] && [scanner scanCharactersFromSet:charactersToCount intoString:&charactersFromString]) {
    2. NSMutableArray *stringBuffer = [NSMutableArray arrayWithCapacity:[charactersFromString length]];
    3. for (int i = 0; i < [charactersFromString length]; i++) {
    4. [stringBuffer addObject:[NSString stringWithFormat:@"%C", [charactersFromString characterAtIndex:i]]];
    5. }
    6. }
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Quellcode

    1. if ([scanner scanUpToCharactersFromSet:charactersToCount intoString:NULL] && [scanner scanCharactersFromSet:charactersToCount intoString:&charactersFromString]) {
    2. NSMutableArray *stringBuffer = [NSMutableArray arrayWithCapacity:[charactersFromString length]];
    3. for (int i = 0; i < [charactersFromString length]; i++) {
    4. [stringBuffer addObject:[NSString stringWithFormat:@"%C", [charactersFromString characterAtIndex:i]]];
    5. }
    6. }


    Ah okay... das heißt, man scannt alles was man nicht ahben will, erst "ins Leere" und wenn man dann was passendes findet übernimmt man das in den String... Okay. Vielleicht macht es jetzt mal endlich Klick...

    Besten Dank auf jeden Fall.
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io