Je cherche à améliorer ma compréhension de la gestion mémoire et ma syntaxe C.
Pour ce faire j'ai écrit le petit programme suivant :
#include <stdio.h>
#include <stdlib.h>
//Definition des constantes pour taille de tableaux
#define NAME_SIZE 20
#define BIRTH_MONTH_SIZE 20
//Création d'une structure qui va contenir toutes les informations sur l'utilisateur
typedef struct
{
char name[NAME_SIZE];
char month[BIRTH_MONTH_SIZE];
unsigned int day;
unsigned int year;
unsigned int mobile;
}User;
int main(void)
{
User user;
printf("Name : ");
//Saisie du nom de l'utilisateur
if(fgets(user.name,20,stdin) == NULL)
{
fprintf(stderr,"Error : Failed to read user input \n");
return EXIT_FAILURE;
}
printf("Date of Birth (Month/DD/YYYY) : ");
//Saisie de la date de naissance
if(scanf("%20s %u %u",user.month,user.day,user.year) != 3)
{
fprintf(stderr,"Error : Failed to read user input \n");
return EXIT_FAILURE;
}
printf("Mobile : ");
//Saisie du numéro de mobile
if(scanf("%u",user.mobile) != 1)
{
fprintf(stderr,"Error : Failed to read user input \n");
return EXIT_FAILURE;
}
//Affichage des coordonnées complètes
printf("Name : %s \n", user.name);
printf("DOB : %s %u %u \n", user.month, user.day, user.year);
printf("Mobile : %d \n", user.mobile);
return 0;
}
Cependant lors de la compilation j'obtiens des avertissements :
main.c:34:18: warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 3 has type ‘unsigned int’ [-Wformat=]
if(scanf("%20s %u %u",user.month,user.day,user.year) != 3)
~^ ~~~~~~~~
main.c:34:21: warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 4 has type ‘unsigned int’ [-Wformat=]
if(scanf("%20s %u %u",user.month,user.day,user.year) != 3)
~^ ~~~~~~~~~
main.c:43:13: warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘unsigned int’ [-Wformat=]
if(scanf("%u",user.mobile) != 1)
Puis lors de la saisie de la date de naissance, le programme provoque une erreur de segmentation.
Si on traduit grossièrement l'avertissement, on attend comme argument 3 un unisgned int * (car format %u), mais c'est un unsigned int qui est trouvé. Et effectivement, tu donnes à scanfuser.day là où il faudrait donner son adresse. Pareil pour les autres avertissements.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)