SYNOPSIS string sprintf(string fmt, ...) BESCHREIBUNG Mit dieser Funktion kann man auf einfache Weise aus dem Inhalt von Variablen einen String bauen; und dies effektiver als mit der ueblichen "Du hast "+anzahl+" Punkt(e)"-Methode. Die Funktion bekommt als erstes Argument einen Formatstring fmt, der Informationen darueber enthaelt, wie die weiteren beliebigen Argumente in den Ergebnisstring eingebaut werden sollen. Die meisten Zeichen gelangen vom Formatstring unveraendert in den Ausgabestring. Die Regeln zum Einbau eines Arguments werden immer mit '%' eingeleitet. Moechte man ein '%' in die Ausgabe bringen, so muss man im Formatstring "%%" verwenden. Ein einfaches Beispiel ist erg=sprintf("%s %d", str, i); '%' leitet einen Argumentformatstring (AFS) ein. Das 's' schliesst ihn ab und besagt, dass ein String eingebaut werden soll. Das folgende Leerzeichen wird unveraendert uebernommen. '%' leitet wieder einen neuen Formatstring ein, wobei 'd' eine Ganzzahl bezeichnet (eine Variable von Typ int). Dies ist ein allerdings nur ein sehr einfaches Beispiel. Jeder Argumentformatstring kennzeichnet also, auf welche Art ein Argument in das Ergebnis eingebaut werden soll. Der erste AFS ist fuer das zweite Argument der Funktion, der zweite AFS fuer das dritte Argument u.s.w. (das erste Argument der Funktion ist ja der Formatstring selbst). Jeder AFS beginnt mit einem '%' und endet mit einem der folgenden Zeichen (Argumenttyp-Kennzeichner): Zeichen Argumenttyp Bemerkung 's' string 'c' integer als ASCII-Zeichen 'd' 'i' integer Dezimalschreibweise 'o' integer Oktalschreibweise 'b' 'B' integer Binaerschreibweise 'x' 'X' integer Hexadezimalschreibweise 'e' 'E' float Exponentialschreibweise 'f' 'F' float Gleitkommadarstellung 'g' 'G' float Gleitkommadarstellung 'O' mixed Gibt fuer Debugging alles irgendwie lesbar aus, auch Arrays und Mappings 'Q' mixed Wie 'O', gibt jedoch Sonderzeichen in Strings in der LPC-Notation aus Zwischen dem '%' und dem Argumenttyp-Kennzeichner kann man noch mehrere Modifikatoren setzen, die das Verhalten beeinflussen. Hier eine Uebersicht. n steht hier fuer eine Ganzzahl, also zum Beispiel "12". Modifikator Bedeutung n Minimale Stringlaenge, die fuer dieses Argument verwendet werden soll. Fehlende Zeichen werden mit einem Fuellzeichen aufgefuellt. Beginnt n mit einer '0' (etwa "08") so ist das Fuellzeichen '0' sonst ist es per Default ' '. (sogenannte 'Feldbreite') .n Bei Ganzzahlen die Maxanzahl der Stellen, bei Gleit- kommazahlen die Maximalzahl der Nachkommastellen. Bei (einfachen) Strings die Maximallaenge. :n Ist dasselbe wie n.n - setzt also beide Werte auf dieselbe Zahl. 'X' Als Fuellzeichen wird X genutzt. X koennen dabei auch mehrere Zeichen sein, etwa fuehrt '-=' zu Fuellungen der Art "-=-=-=-=". Um mit Hochkommas zu fuellen ist '\\'' anzugeben. Rueckwaerts- schraegstrich entsprechend mit '\\\\'. Vor positive Zahlen wird ein Leerzeichen gefuegt. + Vor positive Zahlen wird ein '+' gefuegt. - Der Wert wird linksbuendig in das fuer dieses Argument vorgesehene Feld eingefuegt (Standard ist rechts- buendig). Bei Strings wird meistens diese Ausrichtung die sinnvollste sein. | Der Wert wird zentriert in das Feld eingefuegt. (Siehe Modifikator n, Feldbreite) $ Blocksatz. Benoetigt eine Feldbreite, funktioniert nur bei Strings (auch im Spaltenmodus). = Spaltenmodus (siehe unten). # Fuer Strings: Tabellenmodus (siehe unten). Fuer '%O'/'%Q': kompakte Ausgabe. @ Arraymodus (siehe unten). * Ein Stern kann immer dort eingesetzt werden, wo hier weiter oben ein n fuer eine Ganzzahl steht. Der Wert der Zahl muss dann als weiterer Parameter an die Funktion uebergeben werden. BEISPIELE Mit den bis jetzt erwaehnten Moeglichkeiten kann man zB machen: sprintf("%d (dec) == %o (octal) == %x (hex)", 20, 20, 20); => "20 (dec) == 24 (octal) == 14 (hex)" sprintf("Du drehst den Knopf um %.3f Umdrehungen", 12.3456); => "Du drehst den Knopf um 12.345 Umdrehungen" sprintf("Du liest %|'*':9s", "Fiona"); => "Du liest **Fiona**" sprintf("Auf dem Zettelstueck steht: %-.*s...", 7, "Hallo Du da"); => "Auf dem Zettelstueck steht: Hallo D... ERWEITERTE MODI Mit dem Modifikatoren = # und @ stehen maechtige Werkzeuge zur Verfuegung. Mit ein wenig Ueberlegung kann man sich oft viele Zeilen Code ersparen. Arraymodus (@): sprintf("%@s", arr_of_string); Der Argumentformatstring (allerdings ohne das @) wird sooft hintereinandergereiht, wieviele Elemente das Array hat. Jeder AFS wird dann fuer ein Element des Arrays benutzt. sprintf("%@s", ({"aaa","bbb"})) ist somit dasselbe wie sprintf("%s%s", "aaa", "bbb"). Allerdings passt es sich immer an die Elementzahl der uebergebenden Arrays an. Dies ist nuetzlich um Ergebnisse von map() oder aehnlich auszugeben. sprintf("%@s", map_objects(all_inventory(), "short")); Der Argumenttyp-Kennzeichner muss hierbei immer dem Typen eines Elementes des Arrays entsprechen. Spaltenmodus (=): Diese Funktion bricht Text um. Die Feldbreite muss angegeben werden. Wird neben der Feldbreite auch eine maximale String- laenge angegeben, so wird die letztere fuer die Breite des Umbrechens verwendet, die Feldbreite wird mit Fuellzeichen aufgefuellt. sprintf("%=-20s", str); bricht den String str 'wordwrap'end auf 20 Zeichen Laenge um. sprintf("%=-*s", len, str); ist schon eine einfache break_string() Variante. Tabellenmodus (#): Diese Funktion gibt Strings tabellenartig aus. Die Teilstrings muessen mit \n getrennt als ein String als Argument uebergeben werden. Die Feldbreite muss angegeben werden und bezeichnet die (maximale) Gesamtbreite der Tabelle. Die Anzahl der Spalten der Tabelle wird moeglichst optimal bestimmt, und ist fuer alle Spalten gleich. Wird ein Wert als 'Praezision' angegeben, so ist dies die Anzahl von Spalten, die verwendet werden soll. sprintf("%#30.4s", str) erzeugt eine Tabelle, die maximal 30 Zeichen breit ist und 4 Spalten enthaelt. sprintf("%#30s", str) legt die Spaltenzahl dynamisch anhand der Einzelstringlaengen fest, so dass der laengste String noch genau in die Tabelle passt. Wenn string* worte die in die Tabelle einzubettenden Worte enthaelt, so muss str=implode(worte,"\n") sein. SIEHE AUCH printf(E)