What is the need of hh and h format specifiers?

c, format-specifiers, scanf

Solution

`&mac[0]` is a pointer to an `unsigned char`.1 `%hhx` means the corresponding arguments points to an `unsigned char`. Use square pegs for square holes: the conversion specifiers in the format string must match the argument types.

1 Actually, `&mac[0]` is a pointer to a `uint8_t`, and `%hhx` is still wrong for `uint8_t`. It “works” in many implementations because `uint8_t` is the same as `unsigned char` in many implementations. But the proper format is `"%" SCNx8`, as in:

#include <inttypes.h>
…
scanf(mac_str, "%" SCNx8 "… rest of format string", &mac[0], … rest of arguments);

Problem

In the code below `mac_str` is char pointer and `mac` is a `uint8_t` array: ``` sscanf(mac_str,"%x:%x:%x:%x:%x:%x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]); ``` When I try the above code it gives me a warning: ``` warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 8 has type ‘uint8_t *’ [-Wformat] ``` but I saw in some code they specified ``` sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]); ``` which doesn't give any warning but both are working the same. What's the need of using `hhx` instead of just `x`?

Original source

Related problems