scanf no puede escanear en uint8_t

Cuando trato de usar scanf con uint8_t , obtengo resultados locos. Usando int , obtengo la salida esperada “08 – 15”. Usando uint8_t , obtengo “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); 

Estoy usando GCC.

El %d es incorrecto, porque significa que está pasando int * pero que realmente quiere pasar uint8_t * . Necesitarás usar la macro apropiada:

 #include  ... sscanf(foo, "%2" SCNu8 " %2" SCNu8, &d1, &d2); 

La mayoría de los comstackdores deberían advertirle sobre su versión del código. Aquí está la salida de Clang:

 test2.c: 8: 24: advertencia: el formato especifica el tipo 'int *' pero el argumento tiene tipo
       'uint8_t *' (también conocido como 'unsigned char *') [-Wformat]
 sscanf (foo, "% 2d% 2d", & d1, & d2);
              ~~~ ^ ~~
              % 2s
 test2.c: 8: 29: advertencia: el formato especifica el tipo 'int *' pero el argumento tiene tipo
       'uint8_t *' (también conocido como 'unsigned char *') [-Wformat]
 sscanf (foo, "% 2d% 2d", & d1, & d2);
                  ~~~ ^ ~~
                  % 2s
 2 advertencias generadas.

Para uint8_t , esto no se aplica a printf() , ya que uint8_t siempre se promocionará a int antes de pasar a printf() .

El especificador de formato scanf %d dice “Prometo darte un int * “. Usted rompe esa promesa al no proporcionar la dirección de un int . Todas las apuestas están cerradas. (Es un comportamiento indefinido ).

Moraleja: No le mientas a tu comstackdor.

Su código no funciona porque le está diciendo a scanf () que espere un puntero a un tipo de 4 bytes (int) cuando uint8_t es solo un byte.

 #define __USE_MINGW_ANSI_STDIO 1 //or gcc prog.c -std=c99 -D__USE_MINGW_ANSI_STDIO #include  #include  #include  int main(){ const char *foo = "0815"; uint8_t d1, d2; sscanf(foo, "%2" SCNu8 "%2" SCNu8, &d1, &d2); printf("%02" PRIu8 " - %02" PRIu8 "\n", d1, d2); return 0; }