Pb avec les char et strcat

salut à tous.
j’ai des problèmes avec les “char” . en fait je voulais faire une fonction qui initialise un tableau avec “” . Mais le problème c’est que quand j’utilise un seul p[ ] , dans ma 2ème fonction quand je modifie une case toutes les cases sont modifiées .J’ai essayé de faire avec un p2[ ] et là il modifie qu’un seule case. Mais comment je peux faire pour initialisé mon tableau ??car normalement je devrais avoir un tableau de 256 cases. car je peut pas faire de p[ ] a p256 [ ]. si qq1 pourrai m’aider car je vois vraiment pas comment faire
je vous remercie d’avance:)

voici le code :
Code :

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include<sys/stat.h>

void initialisation(char *tab[],int taille){

int i;
char p[2560]="";
char p2[2560]=“2”;
for(i=0; i<taille-1 ; i++){
tab[i] =p;
}
tab[taille-1] =p2;
}

void codage(){
char *tab[2560];
int i,j;
int k=3;
char *zero=“0”;
char *un=“1”;

initialisation(tab,6);
for(i=0; i<k ; i++){

tab[i]= strcat( tab[i] ,zero);
}
for(j=k; j < 6 ;j++){

tab[j]=strcat( tab[j],un);
}
for(i=0;i<6;i++){
printf("%s\n",tab[i]);
}
}

int main (int argc, char ** argv){

codage();

return (EXIT_SUCCESS);

}

et le resultat :
Code :

00011
00011
00011
00011
00011
21

void initialisation(char *tab[],int taille){
	int i;
	char p[2560]="";
	char p2[2560]="2";
	for(i=0; i < taille-1 ; i++){
		tab[i] =p;
	}
	tab[taille-1] =p2;
}

Tu te fais avoir par la sémantique du C…

Ce n’est pas parce ce que tu fais tab[i] =p;

Que le compilateur va transformer ton code en : tab[i] = strdup§;

Pour mieux comprendre ce que tu fais, essaye de faire ça (ou utilise gdb):

for (int i = 0; i < taille; ++i) printf(“addr(tab[%d]) = 0x%08X”, i, tab[i]);

Tu verras que pour chacun des éléments, tu as la même adresse, ie: tu pointes sur la même chose. Tous les éléments de ton tableau sont égaux parce qu’ils pointent sur la même adresse. D’où l’utilisation de strdup() et consort pour

  1. allouer N octets (strlen§+1) ce qui donne l’adresse q
  2. copier le contenu de p à partir de l’adresse q
  3. avoir un contenu (ici: un pointeur sur un char) différent

Au passage, de la même façon, tu ne peux pas appeler strcat “comme ça”. Il faut que tu t’assures que la chaîne de destination (ou le tableau, ou char* ) puisse contenir les caractères à ajouter. ie: strlen(dest) + strlen(s2) < sizeof(dest). Enfin, tu peux déclarer les variables là où t’en as besoin, pas forcément que en haut de fonction.

Ce n’est pas plus long (sauf éventuellement à la compilation).

Merci pour ta réponse,mais peux tu etre un peu plus explicite s’il te plait car j’ai bien lu ta réponse,et je ne comprend pas comment modifier mon programme pour que ça marche.Est ce que tu pourrais m’aider pour ça?car c’est important,c’est pour un projet et je n’ai plus beaucoup de temps avant de devoir le rendre.
Je te remercie par avance.

Pour code pas du tout securise… :


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/stat.h>

#define ZERO "0"
#define ONE  "1"
#define MID   3
#define SIZE  6

void initialisation(char *tab[], int taille)
{
  int i;

  for(i = 0; i < taille; i++)
    tab[i][0] = 0;
}

void codage()
{
  char  tab[256][256];
  int	i;
  int	j;

  initialisation(tab, SIZE);
  for(i = 0; i < MID; i++)
    tab[i]= strcat(tab[i], ZERO);

  for(j = MID; j < SIZE; j++)
    tab[j]=strcat(tab[j], ONE);

  for(i = 0; i < SIZE; i++)
    printf("%s\n",tab[i]);
}

int main (int argc, char ** argv)
{
  codage();
  return (EXIT_SUCCESS);
}

J’ai pas essaye de compiler… mais j’ai cru comprendre que c’est ce que tu voulais faire. Si t’as besoin d’explications n’hesites pas.

En fait je viens de relire le code et la ce que tu vas avoir en sortie c’est surement qq chose comme :
0
0
0
1
1
1

C’est surement pas ce que tu veux faire…
Edité le 22/04/2008 à 18:49

Salut!
C’est bien le résultat que je veux obtenir,mais ton code ne compile pas.
En fait,si j’exécute deux fois la fonction codage,je devrais avoir
00
00
00
11
11
11
Si t’as un peu de temps peux tu y jeter un coup d’oeil car je t’avoue que je désespère…
:frowning:
ps:le but final de mon projet c’est de faire la compression et la décompression selon l’algorithme de shannon fano mais là je suis bloquée à l’étape du codage des caractères du fichier qu’on prend en paramètre.

Il a été donné quand ce projet?

Et qu’est ce que tu as vu en cours? Connais tu malloc(), calloc(), free(), bref l’abc de l’allocation dynamique?

le projet n’a pas été donné il ya longtemps.C’est une matière où on fait des maths mais le projet est à faire en C.Je ne connais pas beaucoup ce langage,je n’ai que quelques bases.
Donc toute aide serait la bienvenue…