2008-08-11 23 views
4

Ich arbeite daran, alten Code von 1998 bis ins 21. Jahrhundert zu bringen. Einer der ersten Schritte in diesem Prozess besteht darin, die printf-Anweisungen in Variablen umzuwandeln. Egal, wie oft ich auf printf zurückschaue, ich vergesse immer das eine oder das andere. Also, zum Spaß, lassen Sie uns es gemeinsam entschlüsseln, um ole 's Willen und in dem Prozess erstellen Sie die erste kleine ' printf Primer ' für Stackoverflow.Dekodierung von printf-Anweisungen in C (Printf Primer)

Im Code, stieß ich auf dieses kleine Juwel,

printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g); 

Wie werden die Variablen a, b, c, d, e, f, g formatiert werden?

Antwort

5

Danny hat meistens Recht.

a. Zeichen ohne Vorzeichen, mindestens 4 Zeichen, Leerzeichen
b. Gleitpunkt, mindestens 16 Stellen vor dem Komma (0 aufgefüllt), 1 Nachkommastelle
c. hex, mindestens 4 Zeichen, 0 gepolstert, Buchstaben werden in Großbuchstaben gedruckt
d. wie oben, jedoch mindestens 2 Zeichen
e. e wird als int angenommen, in ein vorzeichenloses Zeichen umgewandelt und
f gedruckt. wie e
g. Dies ist wahrscheinlich ein Tippfehler, die 4 hat keinen Effekt. Wenn es "% .4s" wäre, würden maximal 4 Zeichen aus der Zeichenfolge gedruckt werden. Es ist interessant festzustellen, dass in diesem Fall die Zeichenfolge nicht null terminiert sein muss.

Edit: jj33 weist 2 Fehler in b und g über here.

+0

Für 'g' zu halten, hat die 4 einen Effekt: wenn die Zeichenfolge kürzer als 4 Zeichen ist, wird es sein, platz- gepolstert (links). –

0

a. dezimal, vier signifikante Ziffern

b. Nicht sicher

c. hex, mindestens 4 Zeichen

d. Auch Hex, mindestens 2 Zeichen

e. 1 Zeichen

f. Zeichenkette, mindestens 4

5

@Jason Day, ich denke, die 4 in den letzten% 4s ist signifikant, wenn es weniger als 4 Zeichen gibt. Wenn es mehr als 4 gibt, haben Sie Recht,% 4s und% s wären gleich, aber mit weniger als 4 Zeichen in g wären% s linksbündig und% 4s wären in einem Feld mit 4 Zeichen rechtsbündig.

b tatsächlich mindestens 16 Zeichen für den gesamten Bereich, einschließlich der Dezimalzahl und die einzelnen Nachkommastelle ist glaube ich (insgesamt 16 Zeichen vs 18 gesamt Zeichen)

3

@ jj33, sind Sie absolut richtig, auf beides zählt.

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    char *s = "Hello, World"; 
    char *s2 = "he"; 

    printf("4s: '%4s'\n", s); 
    printf(".4s: '%.4s'\n", s); 
    printf("4s2: '%4s'\n", s2); 
    printf(".4s2: '%.4s'\n", s2); 

    return 0; 
} 

$ gcc -o foo foo.c 
$ ./foo 
4s: 'Hello, World' 
.4s: 'Hell' 
4s2: ' he' 
.4s2: 'he' 

Guter Fang!

4

Hier ist mein printf Primer: http://www.pixelbeat.org/programming/gcc/format_specs.html

ich kompilieren immer mit -Wall mit gcc, die über irgendwelche Diskrepanzen zwischen den gelieferten printf Formate und Variablen warnen.

+0

Ich zufällig vor Monaten auf diese Grundierung kam und sofort markiert. Ich habe es seitdem ziemlich oft benutzt. Danke, dass du dir die Zeit genommen hast, es zusammen zu stellen! – SiegeX

0

Was Sie wirklich brauchen, ist ein Werkzeug, das die Formatzeichenfolgen in printf() -Anweisungen übernimmt und sie in entsprechende QString-basierte Funktionsaufrufe konvertiert.
Möchte jemand seine Freie-Software-Spende-Zeit für die Entwicklung eines solchen Tools ausgeben?

Platzhalter für URL zu einem Free Software-Hosting-Service, den Quellcode eines solchen Werkzeugs

+1

Oder Sie könnten QString :: sprintf verwenden, das Teil der QString-Klasse ist und "die meisten von printf() bereitgestellten Konvertierungsspezifizierer in der C++ - Standardbibliothek unterstützt." –