leer - scanf string
Usando scanf para leer un personaje sin firmar (2)
El especificador %u
espera un número entero que causaría un comportamiento indefinido al leerlo en un unsigned char
. Deberá usar el especificador de caracteres unsigned char
%hhu
.
Estoy tratando de usar este código para leer valores entre 0 y 255 ( unsigned char
).
#include<stdio.h>
int main(void)
{
unsigned char value;
/* To read the numbers between 0 to 255 */
printf("Please enter a number between 0 and 255 /n");
scanf("%u",&value);
printf("The value is %u /n",value);
return 0;
}
Me sale la siguiente advertencia del compilador como se esperaba.
warning: format ‘%u’ expects type ‘unsigned int *’, but argument 2 has type ‘unsigned char *’
Y esta es mi salida para este programa.
Please enter a number between 0 and 255 45 The value is 45 Segmentation fault
Obtengo el error de segmentación al ejecutar este código.
¿Cuál es la mejor manera de leer valores de caracteres unsigned char
usando scanf
?
Para pre C99 consideraría escribir una función adicional para esto solo para evitar ese fallo de segmentación debido al comportamiento indefinido de scanf.
Enfoque:
#include<stdio.h>
int my_scanf_to_uchar(unsigned char *puchar)
{
int retval;
unsigned int uiTemp;
retval = scanf("%u", &uiTemp);
if (retval == 1)
{
if (uiTemp < 256) {
*puchar = uiTemp;
}
else {
retval = 0; //maybe better something like EINVAL
}
}
return retval;
}
Luego reemplace scanf("%u",
con my_scanf_to_uchar(
Espero que esto no esté fuera del tema, ya que todavía utilizaba scanf
y no otra función como getchar
:)
Otro enfoque (sin función extra)
if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; }
else {/* Do something for conversion error */}