printf format string



  • Hallo,

    Ich habe Probleme beim Verstehen von Format Strings von printf etc. Ich weiss was die Funktion macht (wie sie da steht), aber ich weiss nicht wieso.

    printf("%16.16s\n", buffer);
    

    z.B. Wenn buffer 16 '.' enthält, schreibt diese funktion:

    ................

    Ich versuchte dies auseinander zu nehmen:

    printf("%16.16s\n", buffer);
    /*      
    %[flags][width][.precision][length]type
    
    - Flags müsste also  1 sein?
    - Width müsste       6 sein?
    - Precision müsste   1 sein?
    - Length müsste      6 sein?
    */
    

    Was ist überhaupt "Flags"? Kann mir wer das bitte erklären? Wo ist die Trennlinie zwischen flags, width und precision, length?

    Danke.

    tschüsseli

    PS: Ich habe in diversen cpp reference's nachgeschaut und fand dazu leider absolut nichts.



  • Alle Elemente des Formatkenners (außer dem Typ) sind optional (und können u.u. auch länger sein als 1 Zeichen):

    • flags - Zusatzkennungen wie '-' (linksbündige Ausgabe) '0' (Auffüllen mit 0) etc. steuern die Ausgabe detaillierter
      (in deinem Beispiel gibt's keine Flags)
    • width - der erste Zahlenwert (wenn vorhanden, vor dem '.') des Formatstrings gibt die Mindestlänge der Ausgabe an (führende Nullen zählen als Flag)
      (in deinem Beispiel ist 16 die Breite-Angabe)
    • precision - der Zahlenwert nach dem '.' gibt die Maximallänge von Stringausgaben bzw. die Nachkommastellen bei Gleitkommazahlen an
      (in deinem Beispiel ist .16 die Präzision)
    • length - sind Kennzeichnungen 'l' (long int, wchar_t*), 'h' (short int, char*) oder 'I64' (__int64), um anzuzeigen, daß ein gegebener Wert nicht in der Default-Größe für den Typ vorliegt
      (in deinem Beispiel gibt's keine Größen-Angabe)
    • type - ist das letzte Zeichen der Formatkennung und bestimmt den Typ der dargestellten Variable (und teilweise auch die Darstellungsform)
      (in deinem Beispiel ist der Typ 's' - String (char-Array))

    PS: Eine ausführliche Auflistung der möglichen Format-Elemente findest du auf der Manual-Seite von man: printf(3) (oder in der MSDN).





  • Danke, das war jetzt klar.

    Nächste Frage:

    Ich habe eine Zahl die entweder 1231 oder 123.11234123 oder z.b. 9 sein kann. Wenn ich die variable ineinen buffer speichern will, geht das irgendwie dynamisch oder wie macht man das am besten?

    buff = (char*)malloc(strlen(meine_zahl)); ?

    danke

    druckerformat könig



  • strlen kannst du nur auf Strings anwenden, aber nicht auf int- oder double-Werte. Da mußt du im Ernstfall vor dem Aufruf abschätzen, wie lang die Text-Darstellung der Zahl werden kann (für Ganzzahlen log10(MAX_INT), bei Gleitkommazahlen hängt es von der bevorzugten Darstellungsweise ("normal" oder wissenschaftlich) und der gewünschten Genauigkeit ab, wie lang sie werden können.

    (auf der oben verlinkten Manual-Seite wird auch die Funktion asprintf() genannt, die selber genug Speicher für ihre Ausgabe anfordert - die gehört allerdings nicht zum ANSI-Standard)


Anmelden zum Antworten