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 :

Probleme avec les '[ ]' et les '*' dans une structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut Probleme avec les '[ ]' et les '*' dans une structure
    Bonjour et bon Samedi a tous

    Pourquoi ce code ne fonctionne pas lorsque je mets des '[]' dans les tableaux de ma 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
    char nom[100];
    char prenom[100];
    char adresse[1000];
    char sexe[50];
     
    long age;
     
    }Personne ;
     
    int main()
    {
        long i;
        Personne joueur[2];
     
        joueur[0].nom = "Dupont";
        joueur[0].prenom = "Paul";
        joueur[0].age = 17;
        joueur[0].adresse = "23 rue du parc a Paris";
        joueur[0].sexe = "garcon";
     
        joueur[1].nom = "Alibaba";
        joueur[1].prenom = "Stephanie";
        joueur[1].age = 19;
        joueur[1].adresse = "54 avenue des fleurs a Paris";
        joueur[1].sexe = "fille";
     
        for (i = 0; i < 2; i++)
     
            printf("Joueur 1 : Vous vous appellez %s %s, vous avez %ldans, vous habitez %s et vous etes un(e) %s, bon match!\n", joueur[i].nom, joueur[i].prenom, joueur[i].age, joueur[i].adresse, joueur[i].sexe);
     
     return 0;
    }
    Et lorsque je mets des '*' dans les tableaux de ma structure ça fonction nikel ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
    char *nom;
    char *prenom;
    char *adresse;
    char *sexe;
     
    long age;
     
    }Personne ;

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Parce qu'on n'utilise pas = pour copier des chaînes mais strcpy. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct
    {
        char nom[100];
        char prenom[100];
        char adresse[1000];
        char sexe[50];
     
        long age;
    } Personne ;
     
    ...
     
    strcpy(joueur[0].nom, "Dupont");
    Dans le deuxième exemple, tu utilise des pointeurs à la place des tableaux, c'est pour cela que tu pouvais utiliser =, mais cela ne copie pas la chaîne. Cela stocke juste l'adresse de la chaîne dans le pointeur.

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Pour le second exemple, il est conseillé dans ce cas de mettre const char* plutôt que char* tout court car la modification d'une chaîne comme celles du second exemple est jugé comme comportement indéterminé (cf : ce tutoriel qui te sera peut être utile) ...

    Sinon, il est également plus rigoureux de mettre void entre parenthèses lorsqu'une fonction ne prend pas de paramètres (c'est le cas de main() ici).

    Et attention à l'indentation

    Cordialement,
    Idriss

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Merci a vous..

    Je croyais que les tableaux étaient des pointeurs sur le 1er élément..

    De plus, dans un autre poste on m'a dit que char nom[] est identique a char* nom et char *nom

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je croyais que les tableaux étaient des pointeurs sur le 1er élément..
    Un tableau n'est pas un pointeur mais le compilateur le convertit parfois automatiquement en un pointeur vers le premier élément. Si on te dit le contraire ailleurs, c'est la personne qui te contre qui a tort. Tu trouveras des explication dans ce tutoriel entre autres.

    De plus, dans un autre poste on m'a dit que char nom[] est identique a char* nom et char *nom
    Mon pauvre, t'as été victime d'un très gros mensonge ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Merci a vous..mais il me reste quelques questions..

    1/ si j'ai bien compris char nom[] est identique a char* nom et char *nom que dans les prototypes de fonction et non lors des déclarations.. ?

    2/ Pour ma question initiale, dans ce code, quand je réponds 'Dupont' a la question Quel est votre nom ? c'est comme si je fais utilisateur.nom = "Dupont" alors que nom est un tableau (char nom[100]

    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
    struct Personne
    {
        char nom[100];
        char prenom[100];
        char adresse[1000];
     
        int age;
        int garcon; // Booléen : 1 = garçon, 0 = fille
    };
     
    int main(int argc, char *argv[])
    {
        Personne utilisateur;
     
        printf("Quel est votre nom ? ");
        scanf("%s", utilisateur.nom);
        printf("Votre prenom ? ");
        scanf("%s", utilisateur.prenom);
     
        printf("Vous vous appelez %s %s", utilisateur.prenom, utilisateur.nom);
     
        return 0;
    }
    3/ Pourquoi ce code fonctionne pas ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char nom[100];
    nom = "Dupond" /* ne marche pas */;

    Et celui oui sans utiliser de pointeur ni strcpy??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char nom[100] = "Dupond" /* marche  */;

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2014, 13h06
  2. problem de chaine de caractere dans une structure
    Par lenetfm dans le forum Débuter
    Réponses: 11
    Dernier message: 18/04/2008, 08h25
  3. [PostgreSQL] [PostGreSQL] Trouver les ' et les remplacer par \' dans une chaine
    Par bossLINDROS dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/05/2007, 10h31
  4. Problème avec des caractères spéciaux dans une chaine
    Par thibaut06 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 20/11/2006, 16h46

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