En C comment copier un enregistrement dans un tableau de char

themahg Messages postés 4 Date d'inscription dimanche 4 septembre 2005 Statut Membre Dernière intervention 11 février 2006 - 11 févr. 2006 à 00:08
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 - 13 févr. 2006 à 17:15
ThemahG, Japon toujours!



Aidez moi svp, j'ai un probleme dans mon
prog, g n'arrive pas à copier dans un tableau à 2 dimension
l'enregistrement d'une structure. Voici le code du prog:



#include<stdio.h>

#include<string.h>

#include<conio.h>

#include<stdlib.h>



typedef struct membre {

char categorie;

char nom[20];

char prenom[20];

char adrese[60];

int niveau;

int cotisation;

}MEMBRE;





int encod_memb(membre *,int );

void affich_memb(membre *,int);

char* cree_tableau(membre*,char[][41] ,int);

void aff_index(char[][41],int [],int);

int* indexation(char[][41],int[] ,int,int);

int tri_insertion(int[],int);





void main()

{

//declaration et initialisation

MEMBRE karate[10],*pkarate;

int nmembre=0,i=0,a;

int nadulte=0;

int nenfant=0;

int indexe[10],*pindexe;

char data[10][41],*pdata;

pkarate=&karate[0];

pdata=&data[0][0];

pindexe=&indexe[0];





printf("\n\tGESTION D'UN CLUB DE KARATE \n");

printf("\n\t=========================== \n");

do

{

a=encod_memb(&karate[i],i); /* Encoder jusqu'a ce que la fct<-0 et i=10 */

pdata=cree_tableau(pkarate,data,nmembre);

if(a!=0)

{

i++;

nmembre=i;

if(pkarate->categorie=='A')

{

nadulte=nadulte+1;

}

else

if(pkarate->categorie=='E')

{

nenfant=nenfant+1;

}

}

}

while(nmembre<10 && a!=0);

{

}

/* Mis a jour du nbre d'element

nenfant=*pnenfant; /* Mis a jour du nbre d'enfant

nadulte=*pnadulte; /* Mis a jour du nbre d'adulte */



affich_memb(pkarate,nmembre);



pindexe=indexation(data,indexe,nadulte,nenfant);

aff_index(data,indexe,nmembre);

printf("\n");



printf("\n");

}



// ___fct encod_memb____________

int encod_memb(MEMBRE *pkarate ,int i)

{

int a,c;

printf("\n \n\tEncoder le membre n° %d ",i+1);

printf("\n\tEncoder LA CATEGORIE du membre n° %d:",i+1);

fflush(stdin);

pkarate->categorie=toupper(getchar());



// verifier le nbre d'enfant ou adulte

if(pkarate->categorie=='\n')

{

a=0;

return a;

}



printf("\n\tEncoder LE NOM du membre n° %d:",i+1);

fflush(stdin);

gets(pkarate->nom);



printf("\n\tEncoder LE PRENOM du membre n° %d:",i+1);

fflush(stdin);

gets(pkarate->prenom);



printf("\n\tEncoder L'ADDRESSE du membre n° %d:",i+1);

fflush(stdin);

gets(pkarate->adrese);



printf("\n\tEncoder LE NIVEAU du membre ( 1,2,3 ? ) n° %d:",i+1);

fflush(stdin);

scanf("%d",&c);

pkarate->niveau=c;



// verification de la cotisation

if(pkarate->categorie=='A')

{

if( pkarate->niveau==1)

{

pkarate->cotisation=20;

}

else

if( pkarate->niveau==2)

{

pkarate->cotisation=22;

}

else

{

pkarate->cotisation=24;

}

}

else

if(pkarate->categorie=='E' )

{

if( pkarate->niveau==1)

{

pkarate->cotisation=10;

}

else

if( pkarate->niveau==2)

{

pkarate->cotisation=12;

}

else

{

pkarate->cotisation=14;

}

}

//verification de la touche Enter

if(pkarate->categorie!='\n')

{

a=1;

}

else

{

a=0;

}

return a;

}

///////////////////// creation du tableau

char* cree_tableau(MEMBRE *pkarate, char data[][41],int nmembre)

{

int i,j,ncomax=41;

char tmp[41];



// sauvegarde dans un vecteur temporaire

for(i=0;i<nmembre;i++)

{

tmp[i]=pkarate->categorie;

strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));

strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);



}

for(j=0;j<nmembre;j++)

{

printf("
%c %s ",tmp[j],tmp[j]);

}

//*******************************

for(i=0;i<nmembre;i++)

{

for(j=0;j<ncomax;j++)

{

strcpy((&data[i][j]),&tmp[i]);

}



}

return &data[0][0];





}

//////////////////////////////// INDEXATION/////////////////////////////////////

int* indexation(char data[][41],int indexe[],int nadulte,int nenfant)

{

int i,j,n;

n=nadulte+nenfant;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

if(data[i][j]>=data[i+1][j])

{



if(strcmp(&data[i][j+1],&data[i+1][j+1])<=0)

{

indexe[i]=i;

}

else

{

indexe[i]=i+1;

}

indexe[i]=(indexe,nadulte);

}

else

{



if(strcmp(&data[i][j+1],&data[i+1][j+1])<=0)

{

indexe[nenfant]=i;

}

else

{

indexe[nenfant]=i+1;

}

indexe[i]=(indexe,nenfant);

}

}



}

return indexe;

}

///////affiche index /////////////////////////////////

void aff_index(char data[][41],int indexe[],int nmembre)

{

int i,j;



for(i=0;i<nmembre;i++)

{

for(j=0;j<1;j++)

{

printf("
%c %s %s
",data,data[indexe[i]][j]);

}

}



}

////////////////////////////////////////////

void affich_memb( membre *pkarate,int nmembre)

{

int i=0;

while(i<nmembre)

{

printf("\n %c ",pkarate->categorie);

printf("\n %s ",pkarate->nom);

printf("\n %s ",pkarate->prenom);

printf("\n %s ",pkarate->adrese);

printf("\n %d ",pkarate->niveau);

printf("\n %d ",pkarate->cotisation);

i++;pkarate++;

}



}

//==================================

int tri_insertion(int indexe[],int nmembre)

{

int i,j=0,res;



for(j=1;j<nmembre;j++)

{

i=j-1;

res=indexe[j];

while(indexe[i]>res)

{

indexe[i+1]=indexe[i];

i=i-1;

}

indexe[i+1]=res;

return indexe[i];

}

return indexe[j];

}

4 réponses

cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
11 févr. 2006 à 00:26
Tu colles 200 lignes de code alors que ta question concerne seulement un dixaine de celles-ci. Perso ça ne me donne pas trop envi de chercher ou est le problème dans ton prog !!! Passes plutôt seulement la partie de code ou tu essais de faire la copie.
0
themahg Messages postés 4 Date d'inscription dimanche 4 septembre 2005 Statut Membre Dernière intervention 11 février 2006
11 févr. 2006 à 00:57
ThemahG, Japon toujours!



voici la parti du code qui concerne la copie:



char* cree_tableau(MEMBRE *pkarate, char data[][41],int nmembre)

{

int i,j,ncomax=41;

char tmp[41];



// sauvegarde dans un vecteur temporaire

for(i=0;i<nmembre;i++)

{

tmp[i]=pkarate->categorie;

strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));

strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);



}

for(j=0;j<nmembre;j++)

{

printf("
%c %s ",tmp[j],tmp[j]);

}

//*******************************

for(i=0;i<nmembre;i++)

{

for(j=0;j<ncomax;j++)

{

strcpy((&data[i][j]),&tmp[i]);

}



}

return &data[0][0];





}
0
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
11 févr. 2006 à 12:46
je vois pas ou est le probleme :)
0
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
13 févr. 2006 à 17:15
Hum, c'est bizar ton code.
// sauvegarde dans un vecteur temporaire
1. for(i=0;i<nmembre;i++){
2. tmp[i]=pkarate->categorie;
3. strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));
4. strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);
5.}

ligne 1, supposons nmembre=3
Au premier passage de boucle (OK, pas tout à fait car strlen(pkarate->nom+1) = 19, je pense que tu voulais plutôt faire strlen(pkarate->nom) + 1)
Bref au second passage
tmp[1] = pkarate->categorie ???? c'est moi ou c'est pas ce que tu voulais faire ?
Imaginons que tu as 2 membres
categorie1 = a
nom1 = pierre
prenom1 = ttt

categorie2 = a
nom2 = paul
prenom2 = xxx

au premier passage dans tmp on a
apierrttt
au final dans tmp tu as donc
aapaxxxtt

Es-tu sûr que c'est bien ce que tu voulez faire ?? La sauvagarde dans un "vecteur temporaire" n'est vraiment pas utile, pourquoi ne pas copier directement les données ?

Ou alors j'ai peut-être rien pigé !
0