43

The following test code produces an undesired output, even though I used a width parameter:

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

How to achieve an output like this, which format string to use?

ABC 1234.5 DEF   
ABC   14.5 DEF
nabulke
  • 11,025
  • 13
  • 65
  • 114

2 Answers2

73

The following should line everything up correctly:

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

When I run this, I get:

ABC 1234.5 DEF
ABC   14.5 DEF

The issue is that, in %5.1f, the 5 is the number of characters allocated for the entire number, and 1234.5 takes more than five characters. This results in misalignment with 14.5, which does fit in five characters.

NPE
  • 486,780
  • 108
  • 951
  • 1,012
17

You're trying to print something wider than 5 characters, so make your length specifier larger:

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

The first value is not "digits before the point", but "total length".

JasonD
  • 16,464
  • 2
  • 29
  • 44
  • Note that if you have a chance of printing infinity or Nan, you may want to provide more space after the decimal (at least 4 characters). Then it becomes something like: `printf("ABC %10.4f DEF\n", test);` – phyatt Oct 26 '18 at 16:17