2013-03-07 11 views
18

Die folgenden Testcode erzeugt einen unerwünschten Ausgang, obwohl ich einen Breiten Parameter verwendet:printf Format Schwimmer mit padding

int main(int , char* []) 
{ 
    float test = 1234.5f; 
    float test2 = 14.5f; 

    printf("ABC %5.1f DEF\n", test); 
    printf("ABC %5.1f DEF\n", test2); 

    return 0; 
} 

Output

ABC 1234.5 DEF 
ABC 14.5 DEF 

Wie um eine Ausgabe zu erreichen, So, welche Formatzeichenfolge verwenden?

ABC 1234.5 DEF 
ABC 14.5 DEF 
+0

Dies sieht aus wie c, nicht C++. Wolltest du C++ taggen? – hmjd

+0

@hmjd: Mein richtiger Code ist C++, aber dieses Beispiel ist pure C. Also hast du recht, ich versuche es zu wiederholen. – nabulke

Antwort

31

Folgendes sollte alles richtig up-Linie:

printf("ABC %6.1f DEF\n", test); 
printf("ABC %6.1f DEF\n", test2); 

Als ich das laufen, erhalte ich:

ABC 1234.5 DEF 
ABC 14.5 DEF 

Das Problem ist, dass in %5.1f, die 5 die Zahl von Zeichen, die für die gesamte Nummer zugewiesen sind, und 1234.5 benötigt mehr als fünf Zeichen. Dies führt zu einer Fehlausrichtung mit 14.5, die in fünf Zeichen passt.

+0

Ah, der Dezimalpunkt wird auch in der Breite gezählt, oder? – nabulke

+3

@nabulke: Ja, jedes Zeichen zählt. – NPE

6

Sie versuchen, etwas breiter als 5 Zeichen zu drucken, so dass Ihre Längenangabe größer machen:

printf("ABC %6.1f DEF\n", test); 
printf("ABC %6.1f DEF\n", test2); 

Der erste Wert ist nicht „Stellen vor dem Punkt“, sondern „Gesamtlänge“.