blob: 3cb6970d907c54a7943f330dcfe26fc084093763 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
2 string sprintf(string fmt, ...)
3
4BESCHREIBUNG
5 Mit dieser Funktion kann man auf einfache Weise aus dem Inhalt
6 von Variablen einen String bauen; und dies effektiver als
7 mit der ueblichen "Du hast "+anzahl+" Punkt(e)"-Methode.
8
9 Die Funktion bekommt als erstes Argument einen Formatstring fmt,
10 der Informationen darueber enthaelt, wie die weiteren beliebigen
11 Argumente in den Ergebnisstring eingebaut werden sollen.
12 Die meisten Zeichen gelangen vom Formatstring unveraendert in
13 den Ausgabestring. Die Regeln zum Einbau eines Arguments werden
14 immer mit '%' eingeleitet. Moechte man ein '%' in die Ausgabe
15 bringen, so muss man im Formatstring "%%" verwenden.
16
17 Ein einfaches Beispiel ist erg=sprintf("%s %d", str, i);
18 '%' leitet einen Argumentformatstring (AFS) ein. Das 's' schliesst
19 ihn ab und besagt, dass ein String eingebaut werden soll. Das
20 folgende Leerzeichen wird unveraendert uebernommen. '%' leitet
21 wieder einen neuen Formatstring ein, wobei 'd' eine Ganzzahl
22 bezeichnet (eine Variable von Typ int).
23 Dies ist ein allerdings nur ein sehr einfaches Beispiel.
24
25 Jeder Argumentformatstring kennzeichnet also, auf welche Art
26 ein Argument in das Ergebnis eingebaut werden soll. Der erste
27 AFS ist fuer das zweite Argument der Funktion, der zweite AFS
28 fuer das dritte Argument u.s.w. (das erste Argument der Funktion
29 ist ja der Formatstring selbst).
30
31 Jeder AFS beginnt mit einem '%' und endet mit einem der
32 folgenden Zeichen (Argumenttyp-Kennzeichner):
33 Zeichen Argumenttyp Bemerkung
34 's' string
35 'c' integer als ASCII-Zeichen
36 'd' 'i' integer Dezimalschreibweise
37 'o' integer Oktalschreibweise
38 'b' 'B' integer Binaerschreibweise
39 'x' 'X' integer Hexadezimalschreibweise
40 'e' 'E' float Exponentialschreibweise
41 'f' 'F' float Gleitkommadarstellung
42 'g' 'G' float Gleitkommadarstellung
43 'O' mixed Gibt fuer Debugging alles irgendwie
44 lesbar aus, auch Arrays und Mappings
45 'Q' mixed Wie 'O', gibt jedoch Sonderzeichen in
46 Strings in der LPC-Notation aus
47
48 Zwischen dem '%' und dem Argumenttyp-Kennzeichner kann man
49 noch mehrere Modifikatoren setzen, die das Verhalten
50 beeinflussen.
51 Hier eine Uebersicht. n steht hier fuer eine Ganzzahl, also
52 zum Beispiel "12".
53 Modifikator Bedeutung
54 n Minimale Stringlaenge, die fuer dieses Argument
55 verwendet werden soll. Fehlende Zeichen werden mit
56 einem Fuellzeichen aufgefuellt. Beginnt n mit einer
57 '0' (etwa "08") so ist das Fuellzeichen '0' sonst
58 ist es per Default ' '. (sogenannte 'Feldbreite')
59 .n Bei Ganzzahlen die Maxanzahl der Stellen, bei Gleit-
60 kommazahlen die Maximalzahl der Nachkommastellen.
61 Bei (einfachen) Strings die Maximallaenge.
62 :n Ist dasselbe wie n.n - setzt also beide Werte auf
63 dieselbe Zahl.
64 'X' Als Fuellzeichen wird X genutzt. X koennen dabei
65 auch mehrere Zeichen sein, etwa fuehrt '-=' zu
66 Fuellungen der Art "-=-=-=-=". Um mit Hochkommas
67 zu fuellen ist '\\'' anzugeben. Rueckwaerts-
68 schraegstrich entsprechend mit '\\\\'.
69 <Space> Vor positive Zahlen wird ein Leerzeichen gefuegt.
70 + Vor positive Zahlen wird ein '+' gefuegt.
71 - Der Wert wird linksbuendig in das fuer dieses Argument
72 vorgesehene Feld eingefuegt (Standard ist rechts-
73 buendig). Bei Strings wird meistens diese Ausrichtung
74 die sinnvollste sein.
75 | Der Wert wird zentriert in das Feld eingefuegt.
76 (Siehe Modifikator n, Feldbreite)
77 $ Blocksatz. Benoetigt eine Feldbreite, funktioniert nur
78 bei Strings (auch im Spaltenmodus).
79 = Spaltenmodus (siehe unten).
80 # Fuer Strings: Tabellenmodus (siehe unten).
81 Fuer '%O'/'%Q': kompakte Ausgabe.
82 @ Arraymodus (siehe unten).
83 * Ein Stern kann immer dort eingesetzt werden, wo
84 hier weiter oben ein n fuer eine Ganzzahl steht.
85 Der Wert der Zahl muss dann als weiterer Parameter
86 an die Funktion uebergeben werden.
87
88BEISPIELE
89 Mit den bis jetzt erwaehnten Moeglichkeiten kann man zB machen:
90
91 sprintf("%d (dec) == %o (octal) == %x (hex)", 20, 20, 20);
92 => "20 (dec) == 24 (octal) == 14 (hex)"
93
94 sprintf("Du drehst den Knopf um %.3f Umdrehungen", 12.3456);
95 => "Du drehst den Knopf um 12.345 Umdrehungen"
96
97 sprintf("Du liest %|'*':9s", "Fiona");
98 => "Du liest **Fiona**"
99
100 sprintf("Auf dem Zettelstueck steht: %-.*s...", 7, "Hallo Du da");
101 => "Auf dem Zettelstueck steht: Hallo D...
102
103ERWEITERTE MODI
104 Mit dem Modifikatoren = # und @ stehen maechtige Werkzeuge zur
105 Verfuegung. Mit ein wenig Ueberlegung kann man sich oft viele
106 Zeilen Code ersparen.
107 Arraymodus (@):
108 sprintf("%@s", arr_of_string);
109 Der Argumentformatstring (allerdings ohne das @) wird sooft
110 hintereinandergereiht, wieviele Elemente das Array hat.
111 Jeder AFS wird dann fuer ein Element des Arrays benutzt.
112 sprintf("%@s", ({"aaa","bbb"})) ist somit dasselbe wie
113 sprintf("%s%s", "aaa", "bbb"). Allerdings passt es sich
114 immer an die Elementzahl der uebergebenden Arrays an.
115 Dies ist nuetzlich um Ergebnisse von map() oder aehnlich
116 auszugeben.
117 sprintf("%@s", map_objects(all_inventory(), "short"));
118 Der Argumenttyp-Kennzeichner muss hierbei immer dem Typen
119 eines Elementes des Arrays entsprechen.
120 Spaltenmodus (=):
121 Diese Funktion bricht Text um. Die Feldbreite muss angegeben
122 werden. Wird neben der Feldbreite auch eine maximale String-
123 laenge angegeben, so wird die letztere fuer die Breite des
124 Umbrechens verwendet, die Feldbreite wird mit Fuellzeichen
125 aufgefuellt.
126 sprintf("%=-20s", str); bricht den String str 'wordwrap'end
127 auf 20 Zeichen Laenge um. sprintf("%=-*s", len, str);
128 ist schon eine einfache break_string() Variante.
129 Tabellenmodus (#):
130 Diese Funktion gibt Strings tabellenartig aus. Die Teilstrings
131 muessen mit \n getrennt als ein String als Argument uebergeben
132 werden. Die Feldbreite muss angegeben werden und bezeichnet
133 die (maximale) Gesamtbreite der Tabelle.
134 Die Anzahl der Spalten der Tabelle wird moeglichst optimal
135 bestimmt, und ist fuer alle Spalten gleich. Wird ein
136 Wert als 'Praezision' angegeben, so ist dies die Anzahl von
137 Spalten, die verwendet werden soll.
138 sprintf("%#30.4s", str) erzeugt eine Tabelle, die maximal
139 30 Zeichen breit ist und 4 Spalten enthaelt.
140 sprintf("%#30s", str) legt die Spaltenzahl dynamisch anhand
141 der Einzelstringlaengen fest, so dass der laengste String
142 noch genau in die Tabelle passt.
143 Wenn string* worte die in die Tabelle einzubettenden Worte
144 enthaelt, so muss str=implode(worte,"\n") sein.
145
146SIEHE AUCH:
147 printf(E)