blob: a616bf2760f59ab23df5c0537da77d18a4be4363 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001FUNKTION:
2 int sscanf(string str,string fmt,mixed var1,mixed var2,...)
3
4ARGUMENTE:
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
13RUeCKGABEWERT:
14 Anzahl der gefundenen Argumente.
15
16BESCHREIBUNG:
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
68BEISPIELE:
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
112SIEHE AUCH:
113 explode(E), regexp(E)
114
1158.Aug 2007 Gloinson