Correct way to use scanf / printf (and family) with fixed size types?

8.7k Views Asked by At

Reading this SO question, I started wondering - what is the correct way to use scanf/printf (and family) with fixed size types?

For example, if I have short int or int, I'd use %hd and %d respectively - fine.

But what if I have int16_t? short int may be different from int16_t, it's platform dependent. The same for any other fixed-size (integral) types?


NOTE: As it looks like I received some down-votes, because I "didn't try to google this", it looks like I need to explain: I didn't see similar question here, that's why I posted it. Most of the questions in SO could have been answered using Google, instead of asking here. That would make StackOverflow not the place, that it actually is now.

And NO, I didn't do this for reputation - I already hit the daily reputation cap today (having 24 up votes before posting this question).

My point is - I don't think this deserves down-votes.

2

There are 2 best solutions below

3
On BEST ANSWER

The correct way is to use inttypes.h which defines standard macros for printf family and the scanf family, e.g.

printf ("%" PRId16, short_int);
scanf ("%" SCNd16, &short_int);
1
On

The inttypes.h header file contains macros that define the correct format specifiers for fixed-width integers defined in stdint.h. For example, the type specifier for printf() and int16_t is the macro named PRId16. Example:

int16_t x;
scanf("%" SCNd16, &x);

printf("You have entered: %" PRId16 "\n", x);