2013-03-07 16 views
18

Poniższy kod testowy wywołuje niepożądane wyjście, chociaż użyłem szerokość parametr:printf Format pływak z wyściółką

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 

Jak osiągnąć wyjście w ten sposób, jakiego formatu użyć?

ABC 1234.5 DEF 
ABC 14.5 DEF 
+0

To wygląda jak c, nie C++. Czy zamierzasz oznaczyć tagiem C++? – hmjd

+0

@hmjd: Mój prawdziwy kod to C++, ale ten przykład to czysty C. Więc masz rację, próbuję go retagować. – nabulke

Odpowiedz

31

Poniższa powinny zrównać wszystko poprawnie:

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

Kiedy uruchamiam to uzyskać:

ABC 1234.5 DEF 
ABC 14.5 DEF 

Kwestia jest taka, że ​​w %5.1f The 5 jest liczbą znaków przydzielonych dla całego numeru, a 1234.5 zajmuje więcej niż pięć znaków. Powoduje to niewspółosiowość z 14.5, która mieści się w pięciu znakach.

+0

Ah, przecinek dziesiętny jest również liczony na szerokości, prawda? – nabulke

+3

@nabulke: Tak, liczy się każda postać. – NPE

6

Próbujesz drukować coś szerszego niż 5 znaków, tak aby Państwa specifier większa długość:

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

Pierwsza wartość nie jest „cyfry przed punktem”, ale „długość całkowita”.