# C conversion specifiers and modifiers

> A handy reference to the C conversion specifiers used with printf() and scanf(), like %d, %u, %s, and %f, plus the modifiers that set the field width.

Author: Flavio Copes | Published: 2020-02-20 | Canonical: https://flaviocopes.com/c-conversion-specifiers/

In this post I want to create a helpful reference for all the [C](https://flaviocopes.com/c-introduction/) 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.

This:

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

should print

```
   1
  12
 123
1234
```

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:

```c
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:

```
1.00
1.223e+01
1.2e+01
123.2
```

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`
