Almost. See below ...
Robert Harris said:
(e-mail address removed) wrote:
The # is a flag prefixing "0x" to the result
The 8 is the minimum field width (but some of the field may consist of
spaces before the "0x"). You really need a precision of 8 and a field
width of 10 (to include the "0x", so you need: "%#10.8x"
Both of these are correct but incomplete.
As Jordan Abel pointed out elsethread, the "#" flag ("alternate
form") only applies the prefix is the number is nonzero (for both
octal and hex conversions, in fact). ("Alternate form" has different
meanings for floating-point formats as well.)
The "0" in "08" is also a flag, meaning "pad with zeros instead of
blanks" (for numeric conversions -- the effect is undefined for
conversions like %s). To include a zero flag, it must (obviously)
appear before a numeric field width: "%09d" means "pad with zeros,
9 wide, decimal" but "%90d" means "pad with blanks, 90 wide,
decimal". The zero flag only applies for right-justified fields;
if you specify both the "-" flag and the "0" flag, the "0" flag is
ignored: "%-9d" and "%-09d" mean the same thing (as does "%0-9d").
Using a precision, as in Robert Harris' example above, is roughly
equivalent to specifying the zero flag. But it is not exactly the
same. For instance:
printf("5.2d: >%5.2d<\n", 5);
printf("05d: >%05d<\n", 5);
prints lines with "> 05<" and ">00005<" respectively.
Using "%#10.8x" will do the Right Thing for all nonzero numbers:
printf("*%#10.8x*\n", 0x4321); /* prints *0x00004321* */
but for 0 you get:
printf("*%#10.8x*\n", 0); /* prints * 00000000* */
Note that the 0x has disappeared (as required for "%#x" format),
so 10.8 -- a field width of 10, with a precision of 8 -- now pads
with blanks.
You could leave out the field width ("%#.8x"), but then nonzero
numbers will occupy 10 character fields (8 digits plus the leading
0x) while zero will use 8 character (8 digits, no leading 0x).
You could even write "%#010.8x" and hope for zero padding when
the 0x is omitted, but this seems ... wrong.
The two "best" alternatives are likely "0x%.8x" or "0x%08x",
which will do exactly the same thing.