Partage
  • Partager sur Facebook
  • Partager sur Twitter

Structure tout bête

Indomptable !!

Sujet résolu
    13 décembre 2018 à 16:56:48

    Bonjour à tous,

    Je suis en train d'apprivoiser les structures en essayant de réaliser l'exercice associé (struct Personne), et même en simplifiant le code à son minimum (sans tableau), de manière à bien comprendre le fonctionnement, je rencontre des difficultés.

    La relecture des différents points du cours (pointeurs, chaînes de caractères, structures...) et la recherche d'un sujet similaire ne m'ayant pas éclairé, je me tourne vers la communauté.

    Mon problème est le suivant : je définis une structure simple contenant différents types de variables (char, int) dans mon header, je déclare une variable basée sur cette structure dans mon main, je demande à l'utilisateur d'entrer ses données, et je les affiche à l'écran.

    Pour les chaînes de caractères tout va bien, sauf pour l'adresse : celle-ci ne renvoie que la première expression avant un espace (space).

    Ex : Quelle est vôtre adresse ? 32 rue Micheton

    Votre adresse est : 32

    Deuxièmement, la variable "age" me renvoie une adresse de variable et non une valeur (et oui je sais problème élémentaire de pointeur).

    Je vous serais infiniment reconnaissant si vous pouviez m'éclairer...

    Voici mon main.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include "structure.h"
    
    int main()
    {
        Personne utilisateur = {"", "", "", 0};
    
        printf("Quel est votre nom de famille ? ");
        scanf("%s", utilisateur.nom);
        printf("Votre prenom ? ");
        scanf("%s", utilisateur.prenom);
        printf("Votre adresse ? ");
        scanf("%s", utilisateur.adresse);
        printf("Votre age ? ");
        scanf("%d", &utilisateur.age);
    
        printf("Vous vous appelez %s %s, vous habitez au %s, et vous avez %d ans.", utilisateur.prenom, utilisateur.nom, utilisateur.adresse, &utilisateur.age);
    
        return 0;
    }

    et mon header structure.h :

    #ifndef DEF_STRUCTURE
    #define DEF_STRUCTURE
    
    typedef struct Personne Personne;
    struct Personne
    {
        char nom[100];
        char prenom[100];
        char adresse[1000];
        int age;
    };
    
    #endif // DEF_STRUCTURE
    


    Merci d'avance pour vos retours !

    • Partager sur Facebook
    • Partager sur Twitter
      13 décembre 2018 à 17:06:52

      Tes deux problèmes n'ont rien à voir avec les structures :

      Pour adresse le problème est au moment du stockage de la variable, en fait scanf s'arrête des qu'il trouve un séparateur, dont l'espace fait parti. Le reste des caractères restant dans le buffer clavier. 

      Pour age, ça affiche une adresse car tu demande d'afficher l'adresse de la variable. l'opérateur & veut dire "adresse de"

      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2018 à 18:11:29

        rouloude a écrit:

        Pour age, ça affiche une adresse car tu demande d'afficher l'adresse de la variable. l'opérateur & veut dire "adresse de"

        @Selphos: Peut-être te demandes-tu pourquoi il faut passer l'adresse d'une variable de type int à scanf, mais sa valeur à printf.
        La réponse est que lorsque printf affiche une valeur de type int, elle se fiche de savoir d'où elle vient. On donne directement la valeur à afficher, et puis voilà.
        En revanche, la fonction scanf doit lire l'entier entré, et l'enregistrer sous forme d'un int en mémoire. Et concrêtement, "en mémoire" signifie qu'il faut passer à scanf l'adresse mémoire de la variable int recevant l'enregistrement (la valeur précédente de cette variable étant écrasée).

        -
        Edité par Marc Mongenet 13 décembre 2018 à 18:12:09

        • Partager sur Facebook
        • Partager sur Twitter
          13 décembre 2018 à 19:33:03

          Merci pour vos retours ! Et oui le problème n'a finalement peut-être rien à voir avec les structures, mais c'est bien avec ces dernières qu'il se présente...

          @rouloude: Je suppose que l'on peut remplacer les "spaces" par des "underscores", mais cela signifie-t'il que l'on ne peut entrer d'espace lors d'une saisie de chaîne de caractères ? J'attendrai d'avoir un niveau plus poussé pour obtenir ma réponse.

          @Marc Mongenet: merci pour l'explication ++, je replonge de suite dans les pointeurs.

          Bonne continuation !

          • Partager sur Facebook
          • Partager sur Twitter
            13 décembre 2018 à 20:17:57

            Lorsque la fonction 'scanf' lit une chaîne de caractères, elle s'arrête dès qu'elle tombe sur un caractère de type espace (ça peut êttre une tablulation, un retour chariot ou un véritable espace). C'est comme ça.

            Sauf si on spécifie explicitement, dans le format, qu'on veut lire aussi les espaces. Par exemple, pour lire toute une ligne, on doit spécifier qu'on veut lire tout sauf le caractère '\n' (de fin de ligne). La syntaxe est :

            scanf("%[^\n]", chaine) ;

            Il est donc possible de saisir une chaîne de caractères comportant des espaces.

            (À vérifier quand même, pour ma part j'utilise cette syntaxe en spécifiant une taille de chaîne ce qui est peut-être différent.)

            On a remplacé le 's' par une expression régulière : le ^ signifie "sauf", et '\n' est le caractère de fin de ligne. Le format signifie donc : tous les caractères sauf la fin de ligne.

            Il me semble que le caractère de fin de ligne est lu, donc le tampon est normalement vidé. Si je me trompe, on vide le '\n' avec un simple getchar().

            (À vérifier mais il me semble que l'idée répond à la problématique.)

            -
            Edité par robun 13 décembre 2018 à 20:19:26

            • Partager sur Facebook
            • Partager sur Twitter
              13 décembre 2018 à 23:16:05

              Hello,

              Un petit tutoriel sur scanf()

              -
              Edité par edgarjacobs 13 décembre 2018 à 23:16:15

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                14 décembre 2018 à 10:16:04

                Merci robun et edgarjacobs !!
                • Partager sur Facebook
                • Partager sur Twitter

                Structure tout bête

                × 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