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 :

chaine de caracteres et structure


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut chaine de caracteres et structure
    Bonjour,
    j'ai créer une structure et je n'arrive pas à créer une fonction qui me remplisse le champ nom. Merci pour votre aide.
    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
     
    struct stjoueur {
      char nom [25];
      char couleur;
    };
    typedef struct stjoueur JoueurA;
     
    void SaisieNomCouleur (struct stjoueur * JoueurA)
    {
    char  nomA [25] ;
     
    	printf ("\n Entrer le nom du premier joueur : ");
    	gets (nomA);
    	*JoueurA->nom = nomA;
    	printf ("\n%s", nomA);

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    il faudrait que tu verifie la portée des varialbes.
    Dans ta methode SaisirNomCouleur
    Tu crée un tableau de caracteres dans lequel tu stockes ta chaine.
    Ensuiste tu colles l adresse de ce tableau (espace mémoire en fait) dans ta structure.
    Au moment de terminer la fonction (avant de rendre la main a la fonction appelante), on libere la memoire des variables locales (notement ton tableau de char), donc ta structure regarde maintenant a une adresse qui d'etre liberé...

    Perdu !

    Par contre regarde du coté des fonction strcpy, voir mieux strncpy voir si besoin se fait sentir memcpy.

    Voila voila, a toi maintenant

    P.S. : met un "\n" a la fin de ton printf : printf( "\n%s\n", taStruct->nom );

  3. #3
    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
    2 erreurs sur cette ligne:
    - JoueurA est un pointeur sur struct stjoueur. Pour accéder à un champ d'une structure dont on a l'adresse, l'opérateur -> suffit :
    - On ne peut pas copier un tableau dans un autre en faisant tableau1 = tableau2. D'ailleurs, on ne peut pas écrire tableau1 = ....
    Pour copier un tableau nomA dans un tableau JoueurA->nom, utiliser, si ces tableaux sont des chaînes de caractères standard, la fonction strcpy

    Recommandation : Ne pas utiliser gets mais fgets avec stdin comme paramètre fichier

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut struct
    merci,
    je vais essayer vos recomandations.

    Si j'utilise strcpy, mon argument de fonction n'est pas obligatoirement un pointeur sur structure?

  5. #5
    Membre éprouvé Avatar de siegfried64
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    T a deux solutions,
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct stjoueur {
      char nom [25];
      char couleur;
    };
    typedef struct stjoueur JoueurA;
     
    void SaisieNomCouleur (struct stjoueur * JoueurA)
    {
    char  nomA [25] ;
     
    	printf ("\n Entrer le nom du premier joueur : ");
    	gets (nomA);
    	strcpy(JoueurA->nom,nomA);
    	printf ("\n%s", JoueurA);
    Ou plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct stjoueur {
      char nom [25];
      char couleur;
    };
    typedef struct stjoueur JoueurA;
     
    void SaisieNomCouleur (struct stjoueur * JoueurA)
    {
     
     
    	printf ("\n Entrer le nom du premier joueur : ");
    	gets (JoueurA->nom);
    	printf ("\n%s", JoueurA->nom);

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Citation Envoyé par olivier1212 Voir le message
    merci,
    je vais essayer vos recomandations.

    Si j'utilise strcpy, mon argument de fonction n'est pas obligatoirement un pointeur sur structure?
    Re,

    si tu te pose encore ce genre de question c'est que tu n'est pas encore Opé sur le passage de parametres en C, et la y a pas de solutions miracles :
    - lectures de cours
    - compréhension
    - tests personnels

    Sans ca ce sera dur de passer l étape superieure

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut structure
    Merci pour tes encouragements. J'aurai surement d'autres questions qui viendront sur la sécurisation des entrées clavier.
    Mais comme le dit le proverbe "c'est en forgeant qu'on devient forgeron".

    En attendant j'ai pondu ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void SaisieNom (struct stjoueur * JoueurX)
    {
    char  nomX [25] ;
    	printf ("\n Entrer le nom du premier joueur : ");
    	fgets (nomX, 25, stdin);
    	strncpy (JoueurX->nom, nomX, 25);
    	JoueurX->nom[24] = '\0';
    Est-ce qu'il faut mettre le \0 directement après le dernier caractère tapé ou comme je l'ai fait dans la dernière case?

  8. #8
    Membre éprouvé Avatar de siegfried64
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    Citation Envoyé par olivier1212 Voir le message

    Est-ce qu'il faut mettre le \0 directement après le dernier caractère tapé ou comme je l'ai fait dans la dernière case?
    c'est la fonction fgets qui s en charge, donc ta chaine de caractere contient deja \0,
    apart ca en mettant \0 dans nom[24] , c'est indiquer que le nom comporte exactement 24 caracteres, ce qui n est pas le cas, "james" \0 doit se trouver dans nom[5] pas dans nom[24];
    fgets fait tout le travail pour toi

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut chaine
    Quand je declare une chaine : char nom [25], le dernier élement se trouve en nom[24].
    Dans tous les cas merci pour les renseignements.

  10. #10
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,

    Fallait peut être pas mettre le :
    typedef struct stjoueur JoueurA;
    puisque tu a réécrit " struct stjoueur " :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SaisieNomCouleur (struct stjoueur * JoueurA)
    En gros le JoueurA représente lui aussi le type de ta struture " struct stjoueur " moi j'aurais écrit sa par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SaisieNomCouleur (JoueurA * joueurX_ou_autre)

    j'espère ne pas avoir dit de bêtises .....

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut structure
    ok ça marche merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problem de chaine de caractere dans une structure
    Par lenetfm dans le forum Débuter
    Réponses: 11
    Dernier message: 18/04/2008, 08h25
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. Réponses: 3
    Dernier message: 29/01/2007, 15h10
  4. initialisation chaine de caracteres dans structure
    Par mrttlemonde dans le forum C
    Réponses: 2
    Dernier message: 08/04/2006, 18h07
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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