Structure tableau

Résolu/Fermé
anthony - 17 janv. 2010 à 21:26
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 20 janv. 2010 à 01:17
Bonsoir,
alors voici un code qui marche correctement :
/* Ce programme va enregistrer 4 contacte ainsi que le numéro */
#include <stdlib.h>
#include <stdio.h>
#define MAX 11

main()
{
    struct Contactes{
        char nom[MAX];
        char prenom[MAX];
        char phone[MAX]
    };
    typedef struct Contactes Contactes;
    Contactes c[4];

    int i;

    /* boucle pour ajouter contacte */
    for(i = 0; i < 2; i++)
    {
        puts("Entrez le nom");
        fgets(c[i].nom, MAX, stdin);
        puts("Entrez votre prenom");
        fgets(c[i].prenom, MAX, stdin);
        puts("Entrez votre numero");
        fgets(c[i].phone, MAX, stdin);
    }

    printf("\n\n");

    /* boucle pour afficher contacte */
    for(i = 0; i < 2; i++)
    {
        printf("Nom : %s%s", c[i].nom, c[i].prenom);
        printf("\tTelephone : %s\n", c[i].phone);
    }
    fflush(stdout);
    return 0;
}


j'ai fais des modification pour voir si sa marché avec les modification alors le voici:
/* Ce programme va enregistrer 4 contacte ainsi que le numéro */
#include <stdlib.h>
#include <stdio.h>
#define MAX 20

main()
{
    struct Contactes{
        char nom[MAX];
        char prenom[MAX];
        char phone[MAX]
    } list[4];
    int i;

    /* boucle pour ajouter contacte */
    for(i = 0; i < 2; i++)
    {
        puts("Entrez le nom");
        fgets(list[i].nom[i], MAX, stdin);
        puts("Entrez votre prenom");
        fgets(list[i].prenom[i], MAX, stdin);
        puts("Entrez votre numero");
        fgets(list[i].phone[i], MAX, stdin);
    }

    printf("\n\n");

    /* boucle pour afficher contacte */
    for(i = 0; i < 2; i++)
    {
        printf("Nom : %s%s", list[i].nom[i], list[i].prenom[i]);
        printf("\tTelephone : %s\n", list[i].phone[i]);
    }
    fflush(stdout);
    return 0;
}


alors voila j'ai rajouter a nom, prenom, phone des [i] puisque ce sont des tableaux mais le programme plante et j'aimerais savoir pourquoi ?

3 réponses

diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12
18 janv. 2010 à 02:22
Bonsoir.
L'erreur c'est à l'affichage:
/* boucle pour afficher contacte */
for(i = 0; i < 2; i++)
{
printf("Nom : %s%s", list[i].nom[i], list[i].prenom[i]);
printf("\tTelephone : %s\n", list[i].phone[i]);
}

Tu as ajouté des "[i]" là où il ne fallait pas.
Il faut donc ça:
for(i = 0; i < 2; i++)
{
printf("Nom : %s %s", list[i].nom, list[i].prenom);
printf("\tTelephone : %s\n", list[i].phone);
}
0
masi prenom, nom et phone dont des tableau eu aussi donc pourquoi ne pas mettre [i] ??
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661 > anthony
18 janv. 2010 à 21:42
attentin. ça a l'air d'être des tableaux, mais des tableaux de caractères (char). Ce sont donc en fait des chaines.

nom[i] représente un caractère de cette chaine. Donc ça râle avec le %s : le programme s'attend à avoir un chaine, pas un caractère.

Et de toute façon, comme tu l'avais écrit ça aurait voulu dire : pour le premier enregistrement, écrire le premier caractère du nom, etc... . Pour le deuxième enregistrement, écrire le deuxième caractère du nom, etc... et ainsi de suite, ce qui n'est certainement pas ce que tu souhaites faire.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
18 janv. 2010 à 21:57
Oui, l'erreur vient belle et bien de l'affichage. Tu mets %s alors que l'argument est un char. Ton compilateur devrait te le signaler en tant que warning, d'ailleurs.

De plus, le prototype de main sans argument est : int main (void)
Et enfin, fgets(list[i].nom[i], MAX, stdin); est très bien. Mais il ne faut pas oublier de vider le buffer clavier après. Si l'utilisateur rentre une chaîne trop grande, le deuxième fgets prendra la fin de la précédente chaîne...

Cdlt,
0
oui mais je croyait que pour afficher une chaine il faut mettre %s ici je veux afficher la structure list ou cette structure contient un sous tableau prenom, nom et phone de type char donc pour afficher la chaine de nom, prenom, phone on va utiliser %s donc pour afficher par exemple le tableau phone on va mettre

for(i=0; i < 2; i++)
printf("%s", list[i].phone[i]);

je vois pas ou est le problème dans ce code
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841 > anthony
18 janv. 2010 à 22:19
list[i] est une structure. list[i].nom est de type char[MAX]. Soit un tableau de caractères de MAX éléments.
Si tu fais list[i].nom[i] tu vas pointer sur un caractère dans le tableau. Pour afficher un caractère, c'est possible, il faut utiliser %c.
Or, toi tu souhaites afficher la chaine de caractères. Il faut donc mettre list[i].nom. Ainsi dans ta fonction printf, list[i].nom se transformera en un pointeur sur l'adresse du premier caractère du tableau et affichera successivement tous les caractères jusqu'au '\0' final.

Cdlt,
0
anthony > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
18 janv. 2010 à 22:54
ah oui je comprend mais j'ai encore une autre petite question car je crois que j'ai encore des doutes pour les tableaux:
Bon alors dans les fonction standart pour afficher les valeur il faut mettre l'opérateur * ou [] mais pour afficher uen chaine il faut juste le tableau
printf("%s", tableau);
mais normalement si je suis bien les lecon sa devrait m'afficher les adresse du tableau ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841 > anthony
18 janv. 2010 à 23:23
mais normalement si je suis bien les lecon sa devrait m'afficher les adresse du tableau ?
printf("%s",tableau);
tableau renverra effectivement l'adresse du premier char dans le tableau. Mais comme le dit le man de printf pour le format s :
S’il  n’y a pas de modificateur l, l’argument de type const char* est supposé être un pointeur  sur  un  tableau  de  caractères (pointeur sur une chaîne). Les caractères du tableau sont écrits jusqu’au caractère nul ’\0’ final, non compris.

il faut mettre un pointeur sur un tableau de caractères, d'où tableau.
0
anthony > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
19 janv. 2010 à 00:43
ah ok et j'ai encore une question a te poser si le code aurais eu une nouvelle structure imbriqué qui s'appelle par exemple contacte et je doit afficher après tout ce que j'ai sauvegardé dans le tableaux
sa donnerais ceci
for(i=0; i < 2; i++)
printf("%s\t%s", contcate[i].list[i].prenom, contcate[i].list[i].nom);

est ce que j'ai juste ou je suis hors sujet ??
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12
20 janv. 2010 à 01:17
De rien
0