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).
- flags - Zusatzkennungen wie '-' (linksbündige Ausgabe) '0' (Auffüllen mit 0) etc. steuern die Ausgabe detaillierter
-
http://www.cppreference.com/stdio/printf.html
http://www.dinkumware.com/manuals/?manual=compleat&page=lib_prin.html
-
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)