Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmentation

Saisie avec scanf

Sujet résolu
    23 septembre 2018 à 21:49:18

    Bonjour,

    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.

    D'où peut provenir cette fuite de mémoire ?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter

    Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

      23 septembre 2018 à 22:30:44

      Salut,

      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 à scanf user.day là où il faudrait donner son adresse. Pareil pour les autres avertissements.

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        24 septembre 2018 à 15:13:55

          if(scanf("%20s %u %u",user.month,&user.day,&user.year) != 3)
        • Partager sur Facebook
        • Partager sur Twitter

        Erreur de segmentation

        × 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.
        • Editeur
        • Markdown