1 Dernière modification par mic20010 (15-06-2008 14:59:55)

Sujet : ç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 hmm ) c'est de faire un tableau dynamique d'étudiants, de le remplir en tapant au clavier et qu'il nous l'imprime ensuite.

#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[i].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[i].nom);

à la place de

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

pourtant ça revient exactement à la même chose, ETRANGE.

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".

3

Re : ça marche paaaaas ( prog C )

Tu devrais utiliser

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

4

Re : ça marche paaaaas ( prog C )

Ton précédent exemple n'a pas marché car

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.

/* 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

Re : ça marche paaaaas ( prog C )

Okay merci plume !