J'essaie d'utiliser ce code pour lire des valeurs comprises entre 0 et 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;
}
J'obtiens l'avertissement du compilateur suivant comme prévu.
avertissement: le format "% u" attend le type "unsigned int *", mais l'argument 2 a le type "unsigned char *"
Et ceci est ma sortie pour ce programme.
Veuillez saisir un nombre compris entre 0 et 255 45 La valeur est 45 Erreur de segmentation
J'obtiens l'erreur de segmentation lors de l'exécution de ce code.
Quelle est la meilleure façon de lire unsigned char
valeurs utilisant scanf
?
Le %u
le spécificateur attend un entier qui provoquerait un comportement indéfini lors de la lecture dans un unsigned char
. Vous devrez utiliser le unsigned char
spécificateur %hhu
.
Pour la pré-C99, j'envisagerais d'écrire une fonction supplémentaire pour cela juste pour éviter ce défaut de segmentation dû au comportement indéfini de scanf.
Approche:
#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;
}
Remplacez ensuite scanf("%u",
avec my_scanf_to_uchar(
J'espère que ce n'est pas hors sujet car j'ai toujours utilisé scanf
et pas une autre fonction comme getchar
:)
Une autre approche (sans fonction supplémentaire)
if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; }
else {/* Do something for conversion error */}