Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1564 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pb avec les char * en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb avec les char * en C

n°934247
baka72
Posté le 30-12-2004 à 17:13:17  profilanswer
 

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:

mood
Publicité
Posté le 30-12-2004 à 17:13:17  profilanswer
 

n°934257
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 17:24:32  profilanswer
 

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...

n°934260
baka72
Posté le 30-12-2004 à 17:25:57  profilanswer
 

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

n°934265
dsls
Posté le 30-12-2004 à 17:31:36  profilanswer
 

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.

n°934266
pains-aux-​raisins
Fatal error
Posté le 30-12-2004 à 17:31:48  profilanswer
 

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
n°934273
baka72
Posté le 30-12-2004 à 17:37:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pb avec les char * en C

 

Sujets relatifs
Passer de char array a stringchar traité comme un short
Ecrire des entiers dans un tableau de charchar *a=(char *)(0xAdresse) explication
Concaténer un char à la suite d'une stringConversion char en int, float et double
[C++] Conversion char * vers wchar_t *[C] Probleme de conversion char -> int
Delphi : transtypage Interger -> Char : ??Initialisation d'un char*, malloc ou pas ?
Plus de sujets relatifs à : Pb avec les char * en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR