En C comment copier un enregistrement dans un tableau de char

Signaler
Messages postés
4
Date d'inscription
dimanche 4 septembre 2005
Statut
Membre
Dernière intervention
11 février 2006
-
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
-
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

Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
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.
Messages postés
4
Date d'inscription
dimanche 4 septembre 2005
Statut
Membre
Dernière intervention
11 février 2006

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];





}
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

je vois pas ou est le probleme :)
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
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é !