When I try to use scanf with uint8_t, I get crazy results.
Using int, I get the expected output "08 - 15".
Using uint8_t, I get "00 - 15".
const char *foo = "0815";
uint8_t d1, d2; // output: 00 - 15 (!!!)
// int d1, d2; // output: 08 - 15
sscanf(foo, "%2d %2d", &d1, &d2);
printf("%02d - %02d\n", d1, d2);
I'm using GCC.
The %d is wrong, because it means you are passing int * but you actually want to pass uint8_t *. You will need to use the appropriate macro:
#include <inttypes.h>
...
sscanf(foo, "%2" SCNu8 " %2" SCNu8, &d1, &d2);
Most compilers should be giving you warnings about your version of the code. Here is Clang's output:
test2.c:8:24: warning: format specifies type 'int *' but the argument has type
'uint8_t *' (aka 'unsigned char *') [-Wformat]
sscanf(foo, "%2d %2d", &d1, &d2);
~~~ ^~~
%2s
test2.c:8:29: warning: format specifies type 'int *' but the argument has type
'uint8_t *' (aka 'unsigned char *') [-Wformat]
sscanf(foo, "%2d %2d", &d1, &d2);
~~~ ^~~
%2s
2 warnings generated.
For uint8_t, this does not apply to printf(), since the uint8_t will always be promoted to int before it is passed to printf().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With