The most important key letters are d, g (usually used as "lg"), and s.
|d||int||decimal (base ten) number|
|o||int||octal number (no leading '0' supplied in printf)|
|x or X||int||hexadecimal number (no leading '0x' supplied in printf; accepted if present in scanf) (for printf, 'X' makes it use upper case for the digits ABCDEF)|
|ld||long||decimal number ('l' can also be applied to any of the above to change the type from 'int' to 'long')|
|lu||unsigned long||decimal number|
|c||char [footnote]||single character|
|f||float [footnote]||number with six digits of precision|
|g||float [footnote]||number with up to six digits of precision|
|e||float [footnote]||number with up to six digits of precision, scientific notation|
|lf||double [footnote]||number with six digits of precision|
|lg||double [footnote]||number with up to six digits of precision|
|le||double [footnote]||number with up to six digits of precision, scientific notation|
Footnote: In printf(), the rvalue type promotions are expected. Thus %c actually corresponds to a parameter of type int and %f and %g actually correspond to parameters of type double. Thus in printf() there is no difference between %f and %lf, or between %g and %lg. However, in scanf() what is passed is a pointer to the variable so no rvalue type promotions occur or are expected. Thus %f and %lf are quite different in scanf, but the same in printf.
Personally, I used to use %lg routinely for doubles in both printf and scanf, but this is out of favour these days and indeed gcc will give you a warning message for using %lg in printf. The usual procedure these days is to use %g for double in printf and %lg for double in scanf. It doesn't matter which you use for printf because the printf library function treats them as synonymous, but it's crucial to get it right for scanf.
int dollars = 2; int cents = 3; /* $2.03 */ printf(" ?? what goes here ?? ", dollars, cents);
|If format is||then output is|
|"$%d.%2d"||$2. 3 (one space between "." and "3")|
In "%02d", the 0 is not part of the field width. It is a modifier character. And when you have a field width, you must write it such that it does not start with a zero (and then you can prepend a zero as a modifier character if you want that).