scanf no puede escanear en uint8_t

3 minutos de lectura

scanf no puede escanear en uint8 t
eneldo

Cuando trato de usar scanf con uint8_t, obtengo resultados locos. Utilizando int, obtengo el resultado esperado “08 – 15”. Utilizando uint8_tobtengo “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.

  • Utilizar sscanf(foo, "%hhd %hhd", &d1, &d2);

    – Jérôme Pouiller

    27/09/2021 a las 15:54

scanf no puede escanear en uint8 t
dietrich epp

los %d está mal, porque significa que estás pasando int * pero en realidad quieres pasar uint8_t *. Deberá utilizar la macro adecuada:

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

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

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.

Para uint8_testo no se aplica a printf()desde el uint8_t siempre será ascendido a int antes de que se pase a printf().

  • @wallyk: siéntase libre de corregir errores tipográficos haciendo clic en el botón “editar”.

    -Dietrich Epp

    19 mayo 2014 a las 22:42

  • Claro, pero dado que el resto del código no me resultaba completamente familiar, no estaba seguro de si se trataba de alguna característica nueva del compilador.

    – Wallyk

    19 mayo 2014 a las 22:43

  • En el último punto, no necesariamente. Dependiendo de la implementación de ambos printf y va_argspuede “simplemente funcionar” o puede fallar.

    – slugonamisión

    19 mayo 2014 a las 22:44

  • @slugonamission: No, el estándar C exige explícitamente que los tipos enteros con un rango menor que int ser ascendido a int cuando se pasa a funciones variádicas. los uint8_t También se garantiza que el rango del tipo sea un subconjunto del rango para intpor lo que se garantiza que siempre será correcto.

    -Dietrich Epp

    19 mayo 2014 a las 22:46

  • Lo siento, pensé que estabas sugiriendo el uso de %hhu con uint8_t para evitar la “fealdad” de las macros de especificador de ancho fijo.

    –MM

    20 de mayo de 2014 a las 2:21


1647655086 707 scanf no puede escanear en uint8 t
Kerrek SB

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

Moraleja: no le mientas a tu compilador.

  • Esta respuesta no ayuda de ninguna manera. Si alguien cometió un error (bastante básico) como este, debe explicar por qué y explicar por qué o por qué probablemente no debería usar uint8_t para scanf

    – Miszsoda

    5 de julio de 2021 a las 8:29

#define __USE_MINGW_ANSI_STDIO 1 //or gcc prog.c -std=c99 -D__USE_MINGW_ANSI_STDIO

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

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;
}

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.

1647655087 124 scanf no puede escanear en uint8 t
Sanjay Chakrapani

int y uint8_t son tipos de datos diferentes
int es un tipo firmado de 4 bytes, el rango es -2,147,483,648 a 2,147,483,647
uint8_t es un tipo sin firmar de 1 byte, el rango es de 0 a 255

si intenta usar %d, el error será algo como
format '%d' expects argument of type 'int*', but argument 4 has type 'uint8_t*' {aka 'unsigned char*'} [-Wformat=]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad