2013-03-07 3 views
18

Le code de test suivant produit une sortie indésirable, même si j'ai utilisé un paramètre de largeur:flotteur format printf avec rembourrage

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; 
} 

Sortie

ABC 1234.5 DEF 
ABC 14.5 DEF 

Comment obtenir une sortie comme ceci, quelle chaîne de format utiliser?

ABC 1234.5 DEF 
ABC 14.5 DEF 
+0

Cela ressemble à c, pas C++. Aviez-vous l'intention de marquer le C++? – hmjd

+0

@hmjd: Mon vrai code est C++, mais cet exemple est pur C. Donc vous avez raison, j'essaie de le retaguer. – nabulke

Répondre

31

Ce qui suit doit être aligné tout correctement:

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

Quand je cours, je reçois:

ABC 1234.5 DEF 
ABC 14.5 DEF 

Le problème est que, dans %5.1f, le 5 est le nombre de caractères alloués pour le nombre entier, et 1234.5 prend plus de cinq caractères. Cela se traduit par un mauvais alignement avec 14.5, qui correspond à cinq caractères.

+0

Ah, le point décimal est aussi compté dans la largeur, n'est-ce pas? – nabulke

+3

@nabulke: Oui, chaque personnage compte. – NPE

6

Vous essayez d'imprimer quelque chose plus de 5 caractères, afin de rendre votre plus grande longueur de spécificateur:

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

La première valeur est pas « chiffres avant le point », mais « longueur totale ».