Größenbeschränkung von printf Konvertierungsspezifizierer
-
09-10-2019 - |
Frage
printf
Umwandlung Spezifikationen sind %
von Fahnen gefolgt, Breite, Präzision, Längenmodifizierer und Konvertierungsspezifizierer. Gibt es praktische Grenze der Größe einer Konvertierungsspezifikation?
d. %s
ist 2 Zeichen lang, während %08.2f
6 Zeichen lang ist. Meine Frage ist, was ist die Länge der maximalen Einzel Spezifikation in einem Format-String, die erstellt werden können, nach C99-Standard?
Lösung
Es gibt keine solche Umwandlung Spezifikation der maximalen Länge. Wenn Sie glauben, eine solche spec gefunden habe, kann ich mit einer kommen, die ein Zeichen länger ist.
Zum Beispiel Feldbreite und Genauigkeit prüfen. Die Norm sagt sie Dezimalzahlen sind aber nicht festgelegt, ihre Reichweite. Daher können Sie Konvertierungsspezifizierer mit beliebig großen ganzen Zahlen als Feldbreite oder Genauigkeit schreiben.
Andere Tipps
Wenn Sie eine Zeichenkette meinen, es ist 4095 Zeichen
von C89 Limit von 509 Zeichen gebissen worden (nicht für printf / scanf Formatstrings)5.2.4.1 Übersetzung Grenzen
...
- 4095 Zeichen in einer Zeichenkette wörtlichen oder Weit Stringliteral (nach Verkettung)
...
Ich habe, so dass diese eine der gut ändert, hervorgerufen durch C99: -)
Edit: glibc-Implementierung ( nicht Standard-Definition )
glibc Implementierung wird die Breite von einer read_int
Funktion.
Also, für diese Implementierung, offenbar, vielleicht , die Grenze INT_MAX ist ( Ich habe nicht für die read_int
Funktion gesucht ).
printf Konvertierungsspezifizierer sind% von Fahnen gefolgt, Breite, Präzision, Längenmodifizierer und Konvertierungsspezifizierer. Gibt es praktische Grenze der Größe einer Konvertierungsspezifikation?
Ich hatte in Vergangenheit mit mehreren Standards printf
Implementierungen und meinem allgemeinen Eindruck zu behandeln, dass es keine besondere Beschränkung auferlegt.
Das Format-String ist in der Regel geparsten Zeichen für Zeichen. (Denken Sie einfach FSM .) Die meisten printf
Implementierungen vermeiden Pufferung alles intern und auch für Zahlen verwenden, die char von char Umwandlung in Dezimalzahlen (nicht einmal atoi
).
Sie können beispielsweise prüfen, wie die printf
innerhalb der FreeBSD-Kernel (wo aus vielen anderen Implementierungen oft den Code heben). Das ist sicherlich Implementierung vereinfacht (mit einigem Kernel-spezifischen Optimierungen), aber es zeigt, wie das Format-String wird häufig behandelt.
N. B. So überprüft vfprintf()
Umsetzung der glibc und sie verteilen intern einen Puffer mit malloc()
(falls erforderlich). Also weder besondere Beschränkung gibt.
Meine Frage ist, was ist die Länge der maximalen Einzel Spezifikation in einem Format-String, die erstellt werden können, nach C99-Standard?
Die Formatangabe ist ein Teil eines Strings und String-Länge meines Wissens wird durch den Standard nicht darauf beschränkt. Und wie ich oben erwähnt habe, weder ich je eine Implementierung mit einer solchen Grenze gesehen.