IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Comment on saisit un champ pointeur sur char dans une structure


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 8
    Par défaut Comment on saisit un champ pointeur sur char dans une structure
    Bonjour,

    Ma question a l'aire simple mais à la fois compliquée:

    Voici mon exemple:

    Je saisie une structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //***************
    //   structure etudiant 
    //***************
     
    typedef struct {
                            char * nom; 
                            char * prenom; 
     
    }etudiant;
     
     
    //***************
    // Programme principal
    //***************
    void main () {
     
    etudiant e;
     
    // je veux saisir le nom de l etudiant en prenom aussi les espaces si jamais il est composé. 
    printf("Nom:   ");
    //scanf("%s",&e.*nom);
    gets(e.*nom);
    printf("votre nom est : % s",*nom);
    }
    Mais ceci ne marche pas même si on ajoute la bibliotheque string.h
    Comment le faire SVP !!!

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,



    Pour accéder à un élément : maStructure.monChamp.
    scanf attend un char * donc il suffit de lui passer e.nom mais déclarer un pointeur n'alloue pas l'espace pointée.
    Il te faut donc utiliser malloc et free (cf man ou recherche man free et man malloc dans la barre de recherche tout en haut à droite).

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Le mieux dans ce cas la pour éviter qlq pb serait de faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //***************
    // structure etudiant 
    //***************
     
    typedef struct {
    char  nom[50]; 
    char prenom[50]; 
     
    }etudiant;
     
    void main () {
     
    etudiant e;
     
    // je veux saisir le nom de l etudiant en prenom aussi les espaces si jamais il est composé. 
    printf("Nom: ");
    gets(e.nom);
    printf("votre nom est : % s",e.nom);
    }
    Et ma question est pourquoi du dé-référence ton pointeur a cause de ça tu lui envoie un char et non pas un char* ensuite comme dit plus haut tu ne n'alloue pas ton buffer.

    Ca serait bien de regarder comment fonctionne les pointeurs j'ai l'impression au vu du code que tu ne les maîtrise pas.

  4. #4
    Membre chevronné
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 175
    Par défaut
    Citation Envoyé par jouana Voir le message
    Le mieux dans ce cas la pour éviter qlq pb serait de faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //***************
    // structure etudiant 
    //***************
     
    typedef struct {
    char  nom[50]; 
    char prenom[50]; 
     
    }etudiant;
     
    void main () {
     
    etudiant e;
     
    // je veux saisir le nom de l etudiant en prenom aussi les espaces si jamais il est composé. 
    printf("Nom: ");
    gets(e.nom);
    printf("votre nom est : % s",e.nom);
    }
    la fonction gets n’étant pas top, passer par la fonction fgets serais plus judicieux je pense.

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Je ne fais que récupérer le code existant fournis par mehdouchi, sinon je serais resté sur un read tout banal qui fonctionne très bien aussi.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 8
    Par défaut
    C'est gentil Merci à vous !!! vraiment

    Mais en ce qui concerne !!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
    char  nom[50]; 
    char prenom[50]; 
     
    }etudiant;
    je sais déjà comment le faire !! ( c'est ce qui est expliqué dans plusieurs post et dans les cours )

    Mais dans le cas ou on a des pointeurs je n'ai trouvé aucun post parlant de cela!!


    Je ne peux que faire cela !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void main () {
     
     
            etudiant e;
     
            char commentaire[100] ;
     
     printf("\nNom : ");
             fflush(stdin);
             gets(commentaire);
             e.nom=(char*)malloc((strlen(commentaire))*sizeof(char));
             strcpy(e.name,commentaire);
             printf(" votre nom est %s ", e.name);
    }
    et je trouve ça 1peu pardon du mot mais tellement "bête" car on veut de l'allocation dynamique et non pas un tableau statique "commentaire " comme mémoire tempon pour y stocker des choses puis de les copier par une fonction de copy pour mettre tout cela dans un tableau dynamique!!!

    Qu'en pensez vous y'a t il pas un moyen plus rapide pour allouer de la mémoire dès qu'on rentre la chaîne de caractère voulue ?

    Merci les amis !
    C'est gentil d'avoir répondu !


  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    et je trouve ça 1peu pardon du mot mais tellement "bête" car on veut de l'allocation dynamique et non pas un tableau statique "commentaire " comme mémoire tempon pour y stocker des choses puis de les copier par une fonction de copy pour mettre tout cela dans un tableau dynamique!!!
    On doit allouer de la mémoire AVANT de lire pour stocker ce qu'on lit. On n'y coupera pas.

    Donc ici, on alloue automatiquement un tampon (commentaire) gros, trop gros, mais il n'y en a qu'un qui servira pour toutes les entrées. Cet unique tampon peut servir pour faire des milliers de saisie. Qui plus est, il sera détruit automatiquement en sortant de la fonction où il est defini.

    - Tu as une erreur sur le malloc : il faut un caractère de plus pour stocker le '\0' terminal : e.nom=malloc(strlen(commentaire)+1); .

    - Il ne faut pas utiliser fflush() sur des flux d'entrée (le comportement dépend de l'implémentation) mais uniquement sur des flux de sortie (Voir la FAQ C de ce site sur ce sujet).

    - main() renvoie un int et non pas void lorsque le programme est destiné à tourner sous un système d'exploitation.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Ne jamais faire de fflush sur stdin, le comportement est indéterminé (non décris par la norme, cf FAQ C).

    Ne jamais faire de gets quand on ne maîtrise pas totalement la taille des données lues. Il faut utiliser fgets à la place.

    EDIT : grillé par diogene.
    Il est possible d'utiliser un tampon plus petit et d'utiliser une boucle while avec un realloc si jamais les données lues sont trop grandes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(fgets(stdin, buffer) && buffer[strlen(buffer)] != '\n')
    {
                //malloc puis realloc+ strcpy
    }
    //realloc + strcpy

Discussions similaires

  1. Réponses: 22
    Dernier message: 14/04/2014, 00h02
  2. pointeur sur tableau dans une structure
    Par rollbich dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2013, 22h23
  3. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  4. Comment faire référence à un champ d'un etat dans une requete?
    Par polianita dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/06/2006, 15h26
  5. Comment faire référence à un champ d'un etat dans une requete?
    Par polianita dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 16/06/2006, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo