After the % appear:

The flags are:

The field width is an asterisk or a decimal integer. If the converted value has fewer characters that the field width, it is padded to the width (unless altered by the flags, the padding is with spaces on the left). The field width cannot reduce the width of the converted value. Note that a zero at the start of the width is the "0" flag; it does not mean that the width is in octal.

The precision is a dot followed by an asterisk, a decimal integer, or nothing (equivalent to zero). It can only appear with certain conversions, and its meaning varies:

It must not appear with any other conversion.

If the width, precision, or both, is an asterisk, the actual value is taken from an int argument to the fprintf() function. The arguments are always in the order:

A negative width means add the "-" flag and use the absolute value; a negative precision means that the precision should be treated as if omitted.

The optional letters may appear as follows:

These letters may not appear with any other conversion.