Pb avec les char * en C

Pb avec les char * en C - C - Programmation

Marsh Posté le 30-12-2004 à 17:13:17    

salut, je dois récupérer le nom des personnes propriétaires d'un fichier sous linux et pour ce faire j'ai fait une fonction qui renvoyant le nom du popriétaire mais jarrive pas du tt a lutiliser apres le strcpy marche pas si je veux récupérer le nom de cette personne. merci de maider .
voici mon code
 

Code :
  1. Voici le code la fonction qui renvoi le nom du propriétaire
  2. char* recupNom(int Id){
  3.   FILE *f;
  4.   char mot[30];
  5.   char iduser[30];
  6.   char* user;
  7.   char buffer;
  8.   char bufid;
  9.   int cpt=0,i=0,taille,cptid=0;
  10.   f=fopen("/etc/passwd","r" );
  11.   if (f==NULL)
  12.   {
  13.     printf("Problème de lecture de fichier.\n" );
  14.     exit(1);
  15.   }
  16.   else{
  17.     while(!feof(f)){
  18.       buffer=fgetc(f); 
  19.       if(buffer==':')
  20.       {
  21.         mot[i]='\0';
  22. buffer=fgetc(f);
  23. while(buffer!=':') buffer=fgetc(f);
  24. buffer=fgetc(f);
  25. while(buffer!=':') {
  26.   iduser[cptid++]=buffer;
  27.   buffer=fgetc(f); 
  28. }
  29. iduser[cptid]='\0';
  30. if(atoi(iduser)==Id)
  31. {
  32.     break;
  33. }
  34. else{
  35.   i=0;
  36.   cptid=0;
  37.   while(buffer!='\n') buffer=fgetc(f);
  38. }
  39.       }
  40.       else{
  41. mot[i++]=buffer;
  42.       }
  43.     }
  44. }
  45. fclose(f);
  46. mot[i+1]='\0';
  47. user=malloc((i+1) * sizeof(char));
  48. strcpy(user,mot);
  49. return user;


 

Code :
  1. void afficherFichier(char *repertoire){
  2.   int tabNb[30];
  3.   char** tabUser;
  4.   char *user;
  5.   int cpt=0;
  6.   int temp=0;
  7.   int longeur=0;
  8.   DIR *rep;
  9.   struct dirent *liste;
  10.   struct stat sts;
  11.   char s[NAME_MAX+1] ;
  12.   char nom[30];
  13.    tabUser = malloc(30 * sizeof(char *));
  14.    rep=opendir(repertoire);
  15.   if(rep==NULL){
  16.     printf("Erreur de répertoire 2 : %s\n",repertoire);
  17.   }
  18.   else{
  19.   while((liste=readdir(rep))!=NULL){
  20.     sprintf(s,"%s/%s",repertoire,liste->d_name);
  21.     stat(s,&sts);
  22.     if (((strcmp(liste->d_name,"." )!=0)&&
  23.  (strcmp("..",liste->d_name)!=0)&&
  24.  !S_ISDIR(sts.st_mode))){
  25.       strcpy(user,recupNom(sts.st_uid));
  26.       while((temp<cpt)&&(strcmp(tabUser[temp],user)!=0)) temp++;
  27.       if(strcmp(tabUser[temp],user)==0){
  28.    longeur = strlen(recupNom(sts.st_uid));
  29.   tabUser[cpt]=malloc((longeur+1) * sizeof(char));
  30.  strcpy(tabUser[cpt],user);
  31. tabNb[cpt]=tabNb[cpt]+1;
  32. cpt++;
  33.        }
  34.        temp=0;
  35.     }
  36.   }
  37.   printf("%s :" );
  38.   temp=0;
  39.    while(temp<cpt){
  40.     printf("%s(%d)",tabUser[temp],tabNb[temp]);
  41.     temp++;
  42.     }
  43.   } 
  44.   closedir(rep);
  45. }


 
quelqun pourrait me dire ou est le problème svp  :pt1cable:

Reply

Marsh Posté le 30-12-2004 à 17:13:17   

Reply

Marsh Posté le 30-12-2004 à 17:24:32    

creuse du côté de la durée de vie des variables et de leur mode d'allocation...
 
faire un "return user" alors que user est déclaré en local, c'est pas terrible...

Reply

Marsh Posté le 30-12-2004 à 17:25:57    

tu veux en faite que je le mettre en variable globale ?

Reply

Marsh Posté le 30-12-2004 à 17:31:36    

baka72 a écrit :

tu veux en faite que je le mettre en variable globale ?


Tu peux l'allouer sur le tas (malloc), mais la solution la plus répandue (et la plus propre) est plutôt de changer le prototype de ta fonction par exemple en :
 

Code :
  1. int recupNom(int Id, char *user, int len) { ...}


 
et tu confies à l'appelant le dimensionnement de user.

Reply

Marsh Posté le 30-12-2004 à 17:31:48    

Un truc du genre :
 

Code :
  1. void recupNom(int Id, char* user, int lg){
  2.    ...
  3.    strncpy(user, mot)
  4. }
  5. int main() {
  6.    char user[MAXUSER];
  7.    ...
  8.    recupNom(unId, user, MAXUSER)
  9.    ...
  10. }


Message édité par pains-aux-raisins le 30-12-2004 à 17:34:56
Reply

Marsh Posté le 30-12-2004 à 17:37:00    

Merci pour vos codes mais on vien de me signaler qu'il existait deja une focntion qui renvoyait le nom du propriétaire  
la fonction getpwuid renvoi une strutrure avec divers champs du proprio

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed