MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | FUNKTION: |
| 2 | int sscanf(string str,string fmt,mixed var1,mixed var2,...) |
| 3 | |
| 4 | ARGUMENTE: |
| 5 | str |
| 6 | - String, der nach einem Muster zu durchsuchen ist |
| 7 | - darf nicht NULL sein |
| 8 | fmt |
| 9 | - Format-String, nach dessen Muster untersucht wird |
| 10 | var1,var2,... |
| 11 | - Argumente die mit %d oder %s korrespondieren |
| 12 | |
| 13 | RUeCKGABEWERT: |
| 14 | Anzahl der gefundenen Argumente. |
| 15 | |
| 16 | BESCHREIBUNG: |
| 17 | Wertet einen String <str> unter Beruecksichtigung des Formats <fmt> |
| 18 | aus. <fmt> kann Strings beinhalten, die durch %d und %s getrennt |
| 19 | werden. Jedes %d und %s entspricht einer der Variablen <var1>, <var2>, |
| 20 | etc. in die gespeichert werden soll. |
| 21 | |
| 22 | Die Operatoren im Format-String <fmt> haben eines der folgenden |
| 23 | Formate: |
| 24 | |
| 25 | %[+][!|~][<size>[.<minmatch>]]<type> |
| 26 | |
| 27 | <type> kann folgendes sein: |
| 28 | d: steht fuer eine Zahl |
| 29 | D: steht fuer eine Zahl |
| 30 | U: |
| 31 | s: steht fuer eine Zeichenkette |
| 32 | %: steht fuer das %-Zeichen |
| 33 | t: steht fuer Whitespaces (also Leerschlaege und Tabulatoren), |
| 34 | speichert diese aber nicht. |
| 35 | |
| 36 | <size> ist die erwartete Feldgroesse, <minmatch> die verlangte |
| 37 | minimale Laenge fuer einen Treffer (Standardwerte sind 0 fuer |
| 38 | Strings und 1 fuer Nummern). Sowohl <size> als auch <minmatch> kann |
| 39 | entweder numerisch oder mit '*' angegeben werden - im zweiten Fall |
| 40 | wird die gueltige Variable in der Liste der Argumente benutzt. |
| 41 | |
| 42 | Wird + angegeben, muessen die Zeichen nach dem Feld ebenfalls |
| 43 | matchen. Ist dies nicht der Fall, wird auch dieses Feld als |
| 44 | Misserfolg in der Rueckgabe betrachtet (auch wenn der Wert |
| 45 | bereits an die zugehoerige Variable zugewiesen wurde). |
| 46 | |
| 47 | Wird ! angegeben, wird zwar die Suche durchgefuehrt, aber Treffer |
| 48 | werden weder gespeichert noch gezaehlt. Mit ~ als Argument wird |
| 49 | zwar die Suche durchgefuehrt und die Treffer gezaehlt, das Resultat |
| 50 | wird aber nicht gespeichert. |
| 51 | |
| 52 | Wenn ein %s nicht am Ende von <fmt> steht, wird nur ein Treffer |
| 53 | registriert, wenn auch der nachfolgende String bzw. das |
| 54 | nachfolgende Format gefunden wird. Weiter unten gibt es dazu |
| 55 | ein Beispiel. |
| 56 | Bei einem %d allerdings muss dieses Verhalten mit einem '+' |
| 57 | erzwungen werden. |
| 58 | |
| 59 | Der Unterschied zwischen %d und %D %U ist, dass letzteres ein |
| 60 | unmittelbar vorausgehendes %s so bald als moeglich abbricht, |
| 61 | waehrend ersteres zuerst versucht, einen moeglichst grossen Treffer |
| 62 | fuer %s zu erzielen. Trotzdem ueberspringt %D/%U keine Whitespaces, |
| 63 | dazu muss %.0t%D gesetzt werden. |
| 64 | |
| 65 | Die Funktion sscanf() ist insofern ein Spezialfall, als dass |
| 66 | Argumente automatisch nach Referenz uebergeben werden. |
| 67 | |
| 68 | BEISPIELE: |
| 69 | string who, what; |
| 70 | if (sscanf("wirf frisbee zu rex", |
| 71 | "wirf %s zu %s", what, who) != 2) |
| 72 | write("Usage: Wirf <what> zu <who>\n"); |
| 73 | else |
| 74 | write("Du wirfst einen "+what+" zu "+who+".\n"); |
| 75 | |
| 76 | sscanf("ab", "%s%s", who, what) |
| 77 | ==> liefert 2, who = "", what = "ab" |
| 78 | |
| 79 | sscanf("ab", "%s %s", who, what) |
| 80 | ==> liefert 0, who = 0, what = 0 |
| 81 | |
| 82 | sscanf("ab ", "%s %s", who, what) |
| 83 | ==> liefert 2, who = "ab", what = "" |
| 84 | |
| 85 | |
| 86 | // Achtung bei %d |
| 87 | sscanf("12 ","%d xyz", num1); |
| 88 | ==> liefert 1, num1 = 12 |
| 89 | |
| 90 | sscanf("12 ","%s xyz", num1); |
| 91 | ==> liefert 0, num1 = 0 |
| 92 | |
| 93 | // mit '+' wird das Parsen des Restformats erzwungen: |
| 94 | sscanf("12 ","%+d xyz", num1); |
| 95 | ==> liefert 0, num1 = 12 |
| 96 | |
| 97 | |
| 98 | // Weiteres Beispiel zu %d: |
| 99 | sscanf("get 12 coins","get %d rubys",num) |
| 100 | ==> ergibt 1, weil 'rubys' ignoriert wird |
| 101 | |
| 102 | // Beispiel Format-Ignore 2 |
| 103 | sscanf("get 12 coins","get %+d rubys",num); |
| 104 | ==> ergibt 0, da mit dem '+' das Parsen des Restformats erzwungen wird |
| 105 | ==> ergibt 1 bei 'get 12 rubys' |
| 106 | |
| 107 | // Beispiel Format-Ignore 3 [alte Variante] |
| 108 | sscanf("get 12 coins","get %d rubys%s", num, dummy) |
| 109 | ==> ergibt 1 |
| 110 | ==> ergibt 2 bei "get 12 rubys" |
| 111 | |
| 112 | SIEHE AUCH: |
| 113 | explode(E), regexp(E) |
| 114 | |
| 115 | 8.Aug 2007 Gloinson |