Output Format Specifiers

From NutWiki

Jump to: navigation, search

Contents

Test Environments

Hardware Comments Nut/OS
4.6.4
Nut/OS
4.7.4
Nut/OS
4.8.0
Nut/OS
4.8.7
Ethernut 1.3 H No output
of Double
Binaries
No output
of Double
Binaries
No output
of Double
Binaries
No output
of Double
Binaries
Compiler: AVR-GCC 4.3.2
Ethernut 2.1 B No output
of Double
Binaries
No output
of Double
Binaries
No output
of Double
Binaries
No output
of Double
Binaries
Compiler: AVR-GCC 4.3.2
Ethernut 3.0 E OK
Binaries
NO OK
Binaries
EIR 1.0 C Set jumper JP1
to DEBUG mode.
OK
Binaries
NO OK
Binaries
Compiler: ARM-GCC 4.2.2 ; AVR-GCC 4.3.0

Description

Nut/OS Configurator
Nut/OS Configurator

On this page you will learn about the different format specifiers of the printf() function.

Note that you have to activate floating point numbers in the Nut/OS configurator in order to use them.

Format Specifiers

Format
Specifier
Data type Example
%d
Int (Integer) 161
%c
Character a
%f
Floating-point number
(Holds a total of 7 digits)
3.141592
%lf
Double (long floating)
(Holds a total of 16 digits)
3.141592653589793
%s
String abcdef
%x
Hexadecimal A1

Source Code

#include <dev/board.h>
#include <stdio.h>
 
int main(void)
{
    unsigned long baud = 115200;
 
    NutRegisterDevice(&DEV_DEBUG, 0, 0);
 
    freopen(DEV_DEBUG_NAME, "w", stdout);
    _ioctl(_fileno(stdout), UART_SETSPEED, &baud);
 
    unsigned int integf = 161;
    float floatf = 3.141592;
    double doublef = 3.141592653589793;
    char characf = 'a';
    char *stringf = "abcdef";
 
    printf("Integer:\n\n");
    printf("%d|\t\t\t(format specifier: %%d)\n", integf);
    printf("%9d|\t\t(format specifier: %%9d)\n", integf);
    printf("%09d|\t\t(format specifier: %%09d)\n", integf);
    printf("%-9d|\t\t(format specifier: %%-9d)\n", integf);
    printf("----------------------------------------------------\n");
    printf("Floating:\n\n");
    printf("%f|\t\t(format specifier: %%f)\n", (double)floatf);
    printf("%1.2f|\t\t\t(format specifier: %%1.2f)\n", (double)floatf);
    printf("%1.6f|\t\t(format specifier: %%1.6f)\n", (double)floatf);
    printf("%1.8f|\t\t(format specifier: %%1.8f)\n", (double)floatf);
    printf("%8.1f|\t\t(format specifier: %%8.1f)\n", (double)floatf);
    printf("%8.3f|\t\t(format specifier: %%8.3f)\n", (double)floatf);
    printf("%-8.3f|\t\t(format specifier: %%-8.3f)\n", (double)floatf);
    printf("%08.3f|\t\t(format specifier: %%08.3f)\n", (double)floatf);
    printf("----------------------------------------------------\n");
    printf("Double: (long Floating)\n\n");
    printf("%lf|\t\t(format specifier: %%lf)\n", doublef);
    printf("%1.2lf|\t\t\t(format specifier: %%1.2lf)\n", doublef);
    printf("%1.6lf|\t\t(format specifier: %%1.6lf)\n", doublef);
    printf("%1.15lf|\t(format specifier: %%1.15lf)\n", doublef);
    printf("%15.1lf|\t(format specifier: %%15.1lf)\n", doublef);
    printf("%15.3lf|\t(format specifier: %%15.3lf)\n", doublef);
    printf("%-15.3lf|\t(format specifier: %%-15.3lf)\n", doublef);
    printf("%015.3lf|\t(format specifier: %%015.3lf)\n", doublef);
    printf("----------------------------------------------------\n");
    printf("Character:\n\n");
    printf("%c|\t\t\t(format specifier: %%c)\n", characf);
    printf("----------------------------------------------------\n");
    printf("String:\n\n");
    printf("%s|\t\t\t(format specifier: %%s)\n", stringf);
    printf("----------------------------------------------------\n");
    printf("Hexadecimal:\n\n");
    printf("%d|\t\t\t(format specifier: %%d)\n", integf);
    printf("%x|\t\t\t(format specifier: %%x)\n", integf);
    printf("%X|\t\t\t(format specifier: %%X)\n", integf);
 
    for(;;);
 
    return 0;
}

Details

unsigned int integf = 161;
    float floatf = 3.141592;
    double doublef = 3.141592653589793;
    char characf = 'a';
    char *stringf = "abcdef";

At first we declare a number of variables and a pointer which will later be formatted and displayed by the format specifiers within printf statements.

printf("Integer:\n\n");
    printf("%d (format specifier: %%d)\n", integf);
    printf("%9d (format specifier: %%9d)\n", integf);
    printf("%09d (format specifier: %%09d)\n", integf);
    printf("%-9d (format specifier: %%-9d)\n", integf);

As you can see in the output section, %d displayes an integer value without any spaces in front of. This specifier can be modified by entering numbers between the % and the d By using %9d the integer value takes at least 9 spaces for itself. If the value has less than 9 digits, the spaces getfilled by blanks. If you use %09d instead the spaces gets filled by zeros.

This is called Minimum Field Width.

Putting a - (Minus) in front of the Minimum Field Width value causes the output to be justified on the left.

printf("Floating:\n\n");
    printf("%f|\t\t(format specifier: %%f)\n", (double)floatf);
    printf("%1.2f|\t\t\t(format specifier: %%1.2f)\n", (double)floatf);
    printf("%1.6f|\t\t(format specifier: %%1.6f)\n", (double)floatf);
    printf("%1.8f|\t\t(format specifier: %%1.8f)\n", (double)floatf);
    printf("%8.1f|\t\t(format specifier: %%8.1f)\n", (double)floatf);
    printf("%8.3f|\t\t(format specifier: %%8.3f)\n", (double)floatf);
    printf("%-8.3f|\t\t(format specifier: %%-8.3f)\n", (double)floatf);
    printf("%08.3f|\t\t(format specifier: %%08.3f)\n", (double)floatf);

The specifier for floating point numbers %f may be customized as well.

%1.6f for example sets the Minimum Field Width to 1 and the Precision Specifier to 6. This is the number of decimal places. Note that the statements using %f and %1.6f look the same. Thats because %f uses a default decimal places (Precision) value of 6, as %1.6f does. When using more than 7 digits, e.g. %1.7f (1+7=8), as only 7 digits are supported, the additional ones hold random numbers. (See line 5)

printf("Double: (long Floating)\n\n");
    printf("%lf|\t\t(format specifier: %%lf)\n", doublef);
    printf("%1.2lf|\t\t\t(format specifier: %%1.2lf)\n", doublef);
    printf("%1.6lf|\t\t(format specifier: %%1.6lf)\n", doublef);
    printf("%1.15lf|\t(format specifier: %%1.15lf)\n", doublef);
    printf("%15.1lf|\t(format specifier: %%15.1lf)\n", doublef);
    printf("%15.3lf|\t(format specifier: %%15.3lf)\n", doublef);
    printf("%-15.3lf|\t(format specifier: %%-15.3lf)\n", doublef);
    printf("%015.3lf|\t(format specifier: %%015.3lf)\n", doublef);
printf("Character:\n\n");
    printf("%c|\t\t\t(format specifier: %%c)\n", characf);
printf("%s|\t\t\t(format specifier: %%s)\n", stringf);
printf("Hexadecimal:\n\n");
    printf("%d|\t\t\t(format specifier: %%d)\n", integf);
    printf("%x|\t\t\t(format specifier: %%x)\n", integf);
    printf("%X|\t\t\t(format specifier: %%X)\n", integf);

Note that the last two printf statements use the same int variable as the first one does. By using the %x specifier, the decimal number gets automatically converted into the hexadecimal system.

Output

Output with Nut/OS 4.6.4 on Ethernut 3.0 E:

Integer:

161|                    (format specifier: %d)
      161|              (format specifier: %9d)
000000161|              (format specifier: %09d)
161      |              (format specifier: %-9d)
----------------------------------------------------
Floating:

3.141592|               (format specifier: %f)
3.14|                   (format specifier: %1.2f)
3.141592|               (format specifier: %1.6f)
3.14159203|             (format specifier: %1.8f)
     3.1|               (format specifier: %8.1f)
   3.142|               (format specifier: %8.3f)
3.142   |               (format specifier: %-8.3f)
0003.142|               (format specifier: %08.3f)
----------------------------------------------------
Double: (long Floating)

3.141593|               (format specifier: %lf)
3.14|                   (format specifier: %1.2lf)
3.141593|               (format specifier: %1.6lf)
3.141592653589793|      (format specifier: %1.15lf)
            3.1|        (format specifier: %15.1lf)
          3.142|        (format specifier: %15.3lf)
3.142          |        (format specifier: %-15.3lf)
00000000003.142|        (format specifier: %015.3lf)
----------------------------------------------------
Character:

a|                      (format specifier: %c)
----------------------------------------------------
String:

abcdef|                 (format specifier: %s)
----------------------------------------------------
Hexadecimal:

161|                    (format specifier: %d)
a1|                     (format specifier: %x)
A1|                     (format specifier: %X)

See also

External Links

[1] Wikipedia article about the printf function".


Personal tools