mic200010
Myspace Hunter
ça marche paaaaas ( prog C )
Salut alors j'ai une erreur bizarre sur un petit truc tout con.
Je me suis dit que peut être il y a des gens qui s'y connaissent un peu ici. L'idée de ce truc (en fait je m'entraine pour un partiel :/ ) c'est de faire un tableau dynamique d'étudiants, de le remplir en tapant au clavier et qu'il nous l'imprime ensuite.

code : Tout sélectionner

#include <stdio.h>
#include <stdlib.h>

int main ()
{
int i ;
int a ;
char nom[20];

typedef struct { int age ;
                char nom[20];

} etudiant;

//tableau dynamique d'étudiants

printf("tableau de combien ?\n");

int nombre=0;
scanf("%d", &nombre);

etudiant * tab;
tab =(etudiant*)malloc(nombre*sizeof(etudiant));


//remplissage du tableau

for(i=0;i<nombre;i++)
{   printf("numero %d: \n\n", i);

    printf("age ?\n");
    scanf("%d", &a);
    tab[i].age=a;

    printf("nom ?\n");
    scanf("%s", nom);
    tab[i].nom=nom;  //erreur : "incompatible types in assignment" : WTF ?
}

//impression tu tableau

for (i=0;i<nombre;i++)
printf("etudiant #%d :   age : %d\n, nom : %s",
i, tab[i].age, tab[i].nom);

}
Donc étrangement il bloque à "tab.nom=nom" pourtant nom c'est une chaine de carateres, je l'ai bien défini avant, je le scan correctement (sans & car c'est une chaine de carac). Il y a quelque chose qui m'échappe.
Merci pour ton aide précieuse.

edit :

Bon en fait ça marche avec
printf("nom ?\n");
scanf("%s", tab.nom);

à la place de

printf("nom ?\n");
scanf("%s", nom);
tab.nom=nom;

pourtant ça revient exactement à la même chose, ETRANGE.
Avatar de l’utilisateur
FishBowl
Internet Tough Guy
Re: ça marche paaaaas ( prog C )
C'est normal, tab est un tableau de type "étudiant" alors que nom est un tableau de type "char".
Avatar de l’utilisateur
Plume
L'effaceur
Re: ça marche paaaaas ( prog C )
Tu devrais utiliser

code : Tout sélectionner

scanf ("%19s", tab[i].nom);
Car s'il y a plus de 19 charactères en entrée, ton programme va planter. C'est un buffer overflow.
Le 19 dans le %s limite le nombre de charactères copiés.
su-per
Avatar de l’utilisateur
Plume
L'effaceur
Re: ça marche paaaaas ( prog C )
Ton précédent exemple n'a pas marché car

code : Tout sélectionner

tab[i].nom
est un tableau de char et non pas un pointeur vers un tableau de char.

Ta nouvelle manière de procéder est la bonne, ce que tu aurais pu faire aussi c'est.

code : Tout sélectionner

/* Nom est un pointeur de char et non pas un tableau de char.
 * La nuance est que tu ne peux pas changer un tableau de char
 * d'où ton erreur avec tab[i].nom=nom, car tab[i].nom est un tableau de char 
 */
char * nom;

/* Tu assignes ton pointeur de char au premier char de ton tableau de char 
 * Ce qui est équivalent à nom = &tabl[i].nom[0]
 */
nom = tab[i].nom;


/* Et tu sauvegarde les données dans le tableau pointé par nom
 * ce qui revient à faire scanf("%19s", tab[i].nom); directement 
 */
scanf("%19s", nom);
su-per
mic200010
Myspace Hunter
Re: ça marche paaaaas ( prog C )
Okay merci plume !