In this post I want to create a helpful reference for all the C conversion specifiers you can use, commonly with printf(), scanf() and similar I/O functions.

Specifier Meaning
%d / %i Signed decimal integer
%u Unsigned decimal integer
%c Unsigned char
%s String
%p Pointer in hexadecimal form
%o Unsigned octal integer
%x / %X Unsigned hexadecimal number
%e Floating point number in exponential format in e notation
%E Floating point number in exponential format in E notation
%f double number in decimal format
%g / %G double number in decimal format or exponential format depending on the value

In addition to those specifiers, we have a set of modifiers.

Let’s start with digits. Using a digit between % and the format specifier, you can tell the minimum field width. Example: %3d will take 3 spaces regardless of the number printed.


printf("%4d\n", 1);
printf("%4d\n", 12);
printf("%4d\n", 123);
printf("%4d\n", 1234);

should print


If you put a dot before the digit, you are not telling the precision: the number of decimal digits. This of course applies to decimal numbers. Example:

printf("%4.2f\n", 1.0);
printf("%4.3e\n", 12.232432442);
printf("%4.1e\n", 12.232432442);
printf("%4.1f\n", 123.22);

will print:


In addition to digits, we have 3 special letters: h, l and L.

  • h, used with integer numbers, indicates a short int (for example %hd) or a short unsigned int (for example %hu)
  • l, used with integer numbers, indicates a long int (for example %ld) or a long unsigned int (for example %lu).
  • L, used with floating point numbers, indicates a long double, for example %Lf

Download my free C Handbook, and check out my premium Courses

Coming soon:
Click to find out more โคด๏ธ