Erreur de segmentation - appel strsep

Erreur de segmentation - appel strsep - C - Programmation

Marsh Posté le 15-12-2004 à 18:52:02    

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 ?

Reply

Marsh Posté le 15-12-2004 à 18:52:02   

Reply

Marsh Posté le 15-12-2004 à 19:06:54    

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.

Reply

Marsh Posté le 15-12-2004 à 21:35:29    

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
Reply

Marsh Posté le 15-12-2004 à 23:36:27    

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
Reply

Marsh Posté le 16-12-2004 à 00:17:24    

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"

Reply

Marsh Posté le 16-12-2004 à 00:41:10    

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

Reply

Marsh Posté le 16-12-2004 à 00:43:20    

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
Reply

Marsh Posté le 16-12-2004 à 00:50:53    

*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
Reply

Marsh Posté le 16-12-2004 à 00:53:16    

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

Reply

Marsh Posté le 16-12-2004 à 00:58:38    

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
Reply

Marsh Posté le 16-12-2004 à 00:58:38   

Reply

Marsh Posté le 16-12-2004 à 01:04:03    

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

Reply

Marsh Posté le 16-12-2004 à 01:22:14    

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

Reply

Marsh Posté le 16-12-2004 à 01:25:56    

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

Reply

Marsh Posté le 16-12-2004 à 01:30:28    

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 :)

Reply

Marsh Posté le 16-12-2004 à 01:33:51    

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

Reply

Marsh Posté le 16-12-2004 à 01:41:48    

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

Reply

Marsh Posté le 16-12-2004 à 01:55:16    

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
Reply

Marsh Posté le 16-12-2004 à 02:15:51    

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
Reply

Sujets relatifs:

Leave a Replay

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