2010-10-20 12 views
6

printf Konvertierungsspezifikationen sind % gefolgt von Flags, Breite, Genauigkeit, Längenmodifikator und Konvertierungsspezifizierer. Gibt es eine praktische Grenze für die Größe einer Konvertierungsspezifikation?Größenbeschränkung der printf-Konvertierungsspezifikation

I.e. %s ist 2 Zeichen lang, während %08.2f 6 Zeichen lang ist. Meine Frage ist, wie lang ist die maximale einzelne Spezifikation in einer Formatzeichenkette, die gemäß C99-Standard erstellt werden kann?

+0

Ah ich sehe, Sie sind nur an praktischen Grenzen für eine einzelne Formatangabe einer Formatzeichenfolge interessiert. Ich lösche meine Antwort dann. –

+0

Ich bin neugierig - Gibt es irgendeinen Grund, warum Sie neben Neugier wissen wollen? – nategoose

+0

@nategoose: Ich denke über einen speziellen Wrapper nach 'snprintf' nach und möchte verstehen, ob ich einige temporäre Puffer statisch zuweisen kann. – zaharpopov

Antwort

2

Es gibt keine solche Umrechnungsspezifikation für die maximale Länge. Wenn du denkst, dass du eine solche Spezifikation gefunden hast, kann ich mir eine aussuchen, die länger ist.

Betrachten Sie beispielsweise die Feldbreite und Genauigkeit. Der Standard sagt, dass sie Dezimalzahlen sind, aber nicht ihren Bereich angeben. Daher können Sie Konvertierungsbezeichner mit beliebig großen Ganzzahlen als Feldbreite oder Genauigkeit schreiben.

+0

deshalb gefragt "praktisch" in Frage, nach all dieser Breite ist begrenzt und große Werte arent gültig. auch wenn 64-Bit, ist es praktisch begrenzt – zaharpopov

+1

Während 'printf' wahrscheinlich nicht (und ist nicht erforderlich), um irgendeine Grenze zu erzwingen, bedeutet die Tatsache, dass' printf' die Anzahl der gedruckten Zeichen zurückgibt bedeutet, dass Sie nicht angegeben/undefined (nicht klar, welches) Verhalten, wenn Sie wahnsinnig große Feldbreiten/Genauigkeiten verwenden. Ein realistischerer Grund, warum der Formatspezifizierer eine unbegrenzte Länge haben könnte, sind redundante Flags, z. "% +++++++++++++++++++++++". –

+0

@zaharpopov: Nun, es gibt zwei Ansätze in der Frage 1) praktisch 2) nach dem Standard. Ich habe den letzteren Ansatz gewählt. Ersteres hängt von der Implementierung des Compilers und der Bibliothek ab. – laalto

1

Wenn Sie eine Zeichenkette meine, es ist 4095 Zeichen

5.2.4.1 Übersetzung Grenzen
...
- 4095 Zeichen in einer Zeichenkette wörtlichen oder Weit Stringliteral (nach Verkettung)
...

ich habe von C89 Limit von 509 Zeichen gebissen worden (nicht für printf/scanf-Format-Strings), so ist dies eine der guten Veränderungen mit sich gebracht auf von C99 :-)


Edit: glibc-Implementierung (nicht Standard-Definition)

glibc Implementierung wird die Breite von einer read_int Funktion.
So für diese Implementierung, offenbar, vielleicht, ist die Grenze INT_MAX (Ich habe für die read_int Funktion nicht gesucht).

+1

ja, aber das ist nicht meine Frage. Format darf kein Literal sein - meine Frage ist die Länge des maximalen Spezifizierers nach '%' – zaharpopov

1

printf Konvertierungsspezifikationen sind% gefolgt von Flags, Breite, Genauigkeit, Längenmodifikator und Konvertierungsspezifizierer. Gibt es eine praktische Grenze für die Größe einer Konvertierungsspezifikation?

Ich musste in der Vergangenheit mit mehreren Standard printf Implementierungen umgehen und mein allgemeiner Eindruck, dass es keine bestimmte Grenze auferlegt.

Die Formatzeichenfolge wird im Allgemeinen Zeichen für Zeichen analysiert. (Denken Sie einfach FSM.) Die meisten printf Implementierungen vermeiden intern etwas zu puffern und sogar für Zahlen verwenden Sie die Char-by-char-Konvertierung in Dezimal (nicht einmal atoi).

Sie können zum Beispiel überprüfen, wie die printf innerhalb der FreeBSD kernel implementiert ist (wo von vielen anderen Implementierungen oft den Code heben). Das ist sicherlich eine vereinfachte Implementierung (mit kernelspezifischen Tweaks), spiegelt jedoch wider, wie die Formatzeichenfolge oft gehandhabt wird.

N.B.Just überprüft Glibc vfprintf() Implementierung und sie intern zuweisen einen Puffer (falls erforderlich) mit malloc(). Also keine bestimmte Grenze dort.

Meine Frage ist, was ist die Länge der maximalen einzelnen Spezifikation in einer Formatzeichenfolge, die nach C99-Standard erstellt werden kann?

Der Formatbezeichner ist ein Teil eines Strings und Stringlänge meines Wissens ist nicht durch den Standard beschränkt. Und wie ich oben erwähnt habe, habe ich noch nie eine Implementierung mit einer solchen Beschränkung gesehen.