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
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
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.
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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
Utilizar
sscanf(foo, "%hhd %hhd", &d1, &d2);
– Jérôme Pouiller
27/09/2021 a las 15:54