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 '\\\\'.
        <Space>      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)
