C: Which character should be used for ptrdiff_t in printf?
Which character should be used for ptrdiff_t
in printf
?
Does C standard clearly explains how to print ptrdiff_t
in printf
? I haven't found any one.
int a = 1;
int b = 2;
int* pa = &a;
int* pb = &b;
ptrdiff_t diff = b - a;
printf("diff = %?", diff); // % what?
It's %td
. See here.
C11 draft explains the length modifier for ptrdiff_t
in 7.21.6.1 7 "The fprintf
function"
t
Specifies that a followingd
,i
,o
,u
,x
, orX
conversion specifier applies to aptrdiff_t
or the corresponding unsigned integer type argument; or that a followingn
conversion specifier applies to a pointer to aptrdiff_t
argument.
Use "%td"
as in the following: Credit: @trojanfoe
ptrdiff_t diff = b - a;
printf("diff = %td", diff);
If the compiler does not support "%td"
, cast to a signed type - the longer, the better. Then insure the alternative format and argument match.
// Note the cast
printf("diff = %lld", (long long) diff); // or
printf("diff = %ld", (long) diff);
Ref format specifiers
Use %td
and if your compiler does not support it, you should try %ld
(also cast the input to long
).