Tableaux de pointeurs

luminou -  
 pascal -
Bonjour,

J'essaye d'implémenter une fonction afin de remplir un tableau de chaine de caractère, par chaque ligne d'un fichier texte. Je ne comprends pas car je boucle, et si je lui demande d'affecter à la valeur tab[2] la chaine correspondante, il me l'affecte également à tab[0] à tab [1].... AU final, je me retrouve donc avec une tableau dont les pointeurs pointent sur une même et unique chaine ! HELPPPPPPPPPPP ! Voici le code , et merci d'avance

void lister(int taille,char *tab[N],FILE *fichier){
int i=0;
char logfic[7];
for(i;i<taille;i++){
fscanf(fichier,"%s\n",&logfic);
tab[i]=logfic;
}
}

1 réponse

pascal
 
tu te trompe sur le stackage en memoire des chaine de caractere:

ce que tu fais n'est pas permis en C: UNE CHAINE DE CARACTERE NE PEUT PAS ETRE STOCKE DANS UNE CASE MAIS SEULEMENT DANS UN TABLEAU COMPLET(c'est ce qu'il faut retenir).
le mode de fonctionnement des tableaux est plutot complexe( en gros le tableau est un pointeur comme les autres).
En faite ton code n'est meme pas compilable (avec gcc par exemple).
Ton compilateur (surement encore de microsoft!!)est trop permisible il remplace lui meme
tab[i]=logfic; par tab=logfic;(qui est la syntaxe juste)

c'est a dire que chaque case de logfic va etre recopier dans
les cases correspondantes de tab(par passage par addresse).
Le %s met chaque caractere de ta chaine dans chacune des cases de ton tableau(a raison de 1 SEULE caractere par case).Ainsi apres la ligne tab[i]=logfic, tab sera exactement pareil que logfic et peu importe le i.
De plus lorsque tu appele ton tableau tab[i] (par un printf par exemple) avec un "%s" tu va avoir l'integralite de ton tableau qui s'affiche( et non pas la case i(il faudrait un %c)).
voila d'ou vient le faite que toute les cases de ton tableau affiche la meme chaine quand tu fais printf("%s",tab[i]);
(que ton compilteur remplace par printf("%s",tab); )

(en faite c'est ton tableau qui contient la chaine, chaque case contenant un seul caractere de cette chaine).

Avec ces nouveau element cherche un peu une solution et si tu n'en trouve pas dis le moi et je te donnerais alors la solution a ton probleme.
0