web-dev-qa-db-fra.com

Utilisation de scanf pour lire un caractère non signé

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?

21
user1293997

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.

37
Joe

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 */}
2
grenix