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

  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation - appel strsep

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de segmentation - appel strsep

n°924335
myeve
Posté le 15-12-2004 à 18:52:02  profilanswer
 

Bonjour à tous, voila j'essaie d'utiliser strsep donc j'ai une fonction qui demande a l'utilisateur de rentrer chaine + delimiteur, or j'ai un probleme à la liberation de mes pointeurs:
 

Code :
  1. void
  2. premystrsep()
  3. {
  4. char *str1;
  5. char *str2;
  6. char *opt; //
  7. str1 = (char *)malloc( TAILLE*sizeof(char) );
  8. str2 = (char *)malloc( TAILLE*sizeof(char) );
  9.        
  10. printf("\nFunction mystrsep.\n" );
  11. printf("Entrez une chaine de caracteres : " );
  12.         if ( get_line(str1, TAILLE) ){
  13.         printf("Entrez une chaine de caracteres (delimiteurs): " );
  14.  if ( get_line(str2, TAILLE) ){
  15.           opt = strsep(&str1, str2);
  16.   printf("Resultat :\nSous chaine creee : %s\nChaine initiale tronquee : %s\n",opt, str1);
  17.  }
  18.         }
  19.         else printf("Erreur!" );
  20. if ( str1 != NULL ) //Liberation du pointeur
  21.                 {printf("passed1\n" );free(str1);printf("free1 effect\n" );}
  22.         if ( str2 != NULL ) //Liberation du pointeur
  23.                 {printf("passed2\n" );free(str2);printf("free2 effect\n" );}
  24. }


 
Avec au prealable un fonction get_line qui fonctionne bien et un TAILLE definie a 256:

Code :
  1. int
  2. get_line(char *buf, size_t size)
  3. {
  4. int ret = 0;
  5. if (fgets(buf, size, stdin) != NULL){
  6.  char *p = strchr(buf, '\n');
  7.  if (p != NULL){
  8.   *p = 0;
  9.   ret = 1;
  10.  }
  11.  else{
  12.   int c;
  13.   /* vider stdin proprement (ignorer les caracteres non lus) */
  14.   while ((c = getchar ()) != '\n' && c != EOF)
  15.   {}
  16.  }
  17. }
  18. return ret;
  19. }


 
-> il plante toujours dans le cas du free(str1), je comprends pas, je lui demande si mon pointeur n'est pas nul, libere le!
Qu'est ce qui ne va pas ?

mood
Publicité
Posté le 15-12-2004 à 18:52:02  profilanswer
 

n°924362
Taz
bisounours-codeur
Posté le 15-12-2004 à 19:06:54  profilanswer
 

déjà, tu n'as nul besoin d'allocation dynamique
 
char str1[TAILLE];
 
plus de malloc, ni de free.
 
 
deplus, strsep n'est pas standard, tu ne la trouveras pas partout. Utilise strtok.

n°924509
myeve
Posté le 15-12-2004 à 21:35:29  profilanswer
 

désolé je dois faire avec strsep, on me le demande ;)
 
En plus strsep est pas vouée a remplacer strtok ?
 
Enfin bon, le truc c'est que si j'utilise un char str1[taille], comment l'envoyer en param a strsep qui veut un "char **string" comme 1er argument ?


Message édité par myeve le 15-12-2004 à 21:35:38
n°924624
matafan
Posté le 15-12-2004 à 23:36:27  profilanswer
 

strsep modifie str1. Donc tu liberes un truc qui pointe plus loin que le debut du bloc que tu as alloue. Sauvegarde str1 apres le malloc, et fait le free sur la valeur sauvegardee.
 
Sinon comme l'a dit Taz tu n'as pas besoin de malloc.


Message édité par matafan le 15-12-2004 à 23:36:56
n°924646
myeve
Posté le 16-12-2004 à 00:17:24  profilanswer
 

ah oui ok merci baucoup, je comprends..
 
Mais j'en reviens au fait que si je declare  
char str1[TAILLE], je ne sais pas koi passer a strsep en argument?
strsep(&str1,str2) ne marche plus bien sur, il me dit:
"attention : passage de l'argument n°1 de <strsep> d'un type pointeur incomptabible"

n°924660
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 00:41:10  profilanswer
 

c'est normal str1 est un tableau, il est donc converti en pointeur dans l'appel de fonction -> pas besoin de &

n°924663
myeve
Posté le 16-12-2004 à 00:43:20  profilanswer
 

Oui mais j'ai aussi essayé strsep(str1,str2) et strsep(str1[0],str2), pareil:
"attention : passage de l'argument n°1 de <strsep> d'un type pointeur incompatible"


Message édité par myeve le 16-12-2004 à 00:45:43
n°924673
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 00:50:53  profilanswer
 

*hum*
après un man strsep je comprend mieux, le premier argument de strsep est un pointeur de pointeur...


Message édité par manatane le 16-12-2004 à 00:54:16
n°924676
myeve
Posté le 16-12-2004 à 00:53:16  profilanswer
 

;)
N'empeche que ca me fait une erreur de segmentation..

n°924680
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 00:58:38  profilanswer
 

bon en fait strsep c'est bsd et tu dois initialiser le pointeur de pointeur fourni en premier argument pour qu'il soit diriger vers la chaine à pointer
 
pointeur = str1;
champs = ( &pointeur, str2 );
 
mais il vaut mieux utiliser strtok :)
strsep va te balancer une chaine vide si elle trouve plusieurs séparateurs successivement il faut donc l'utiliser dans une boucle avec un continue si champs[0] est égal au caractère NUL.


Message édité par manatane le 16-12-2004 à 01:08:25
mood
Publicité
Posté le 16-12-2004 à 00:58:38  profilanswer
 

n°924683
myeve
Posté le 16-12-2004 à 01:04:03  profilanswer
 

pas le choix, celui qui me demande ca bosse pour openBSD ;)

n°924696
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 01:22:14  profilanswer
 

tsss ces openbsdiens...
Il aurait au moins pu imposer une autre fonction que l'ignoble fonction BSD strsep (qui illustre bien l'infériorité atterante de cet OS de psychopate face à Linux).
 
Enfin, FreeBSD c'est bien quand meme :D

n°924697
myeve
Posté le 16-12-2004 à 01:25:56  profilanswer
 

Citation :

Il aurait au moins pu imposer une autre fonction que l'ignoble fonction BSD strsep (qui illustre bien l'infériorité atterante de cet OS de psychopate face à Linux).


 
Ah ca y est ca se defoule ;)
 
Vais lui dire direct, il va venir se defendre sur le forum ;)

n°924699
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 01:30:28  profilanswer
 

Euuuh...
J'aurais peut etre du me taire alors :D
Vu combien il faut en baver pour etre développeur OpenBSD çà ne doit quand meme pas etre un branquignole :)

n°924700
myeve
Posté le 16-12-2004 à 01:33:51  profilanswer
 

C'est sur il touche a fond !! (enfin surtout par rapport a mon niveau de debutante)
 
http://www.onlamp.com/pub/a/bsd/20 [...] espie.html

n°924704
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 01:41:48  profilanswer
 

:eek2:
 
Mazette! Tu as de la chance :)
Moi j'apprend tout tout seul bon avec les bouquins de Stevens mais tout seul quand meme (c'est çà d'avoir fait un tout aussi inutile qu'interessant BTS IG) [:sisicaivrai]

n°924708
myeve
Posté le 16-12-2004 à 01:55:16  profilanswer
 

En tout cas merci, j'ai fais un  

Code :
  1. char *tmp = str1;


 
apres le malloc, et je libere a la fin free(tmp).
 
Ca marche bien, je suis contente !
 
Heuu sinon, si je comprends bien dans aucune des fonctions  strcpy,strcmp,etc.. il n'y a besoin de faire de malloc (lorsque c'est a l'utilisateur de rentrer un chaine de caracteres) ??


Message édité par myeve le 16-12-2004 à 01:55:39
n°924713
manatane
En vous remerciant, bonsoir
Posté le 16-12-2004 à 02:15:51  profilanswer
 

il faut se méfier comme de la peste des fonctions de traitement de chaine du C :)
strcpy par exemple ne fournit aucune protection contre les risques de débordement -> à éviter au profit de strncpy.
En général quand un 'n' est ajouté au nom de la fonction c'est bon signe :) Ensuite il faut faire au cas par cas.
 
Concernant l'allocation dynamique ou non, moi personellement je la fais tout le temps. Genre à la place de ton get_line j'utiliserais une fonction qui encadre fgets et alloue de la mémoire à la demande plutot que de limiter purement et simplement la taille de la saisie.


Message édité par manatane le 16-12-2004 à 02:16:20

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

  Erreur de segmentation - appel strsep

 

Sujets relatifs
[C / GTK] erreur avec G_TYPE_CHECK_INSTANCEServlet - erreur sur l'import
Modifier les variables d'appel...appel méthode c++ depuis c
Erreur "Type de données incompatible dans l'expression du ..."[RESOLU]Erreur Installation Oracle --> j'ai besoin d'aide!!
[C] Erreur d'arrondi en float[ASP] Erreur dans le code
erreur compilation gcc parse error at the end of inputerreur avec la fonction system => unable to fork....
Plus de sujets relatifs à : Erreur de segmentation - appel strsep


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