Erreur de segmentation - appel strsep - C - Programmation
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.
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 ?
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.
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"
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 &
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"
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...
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.
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
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
Marsh Posté le 16-12-2004 à 01:30:28
Euuuh...
J'aurais peut etre du me taire alors
Vu combien il faut en baver pour etre développeur OpenBSD çà ne doit quand meme pas etre un branquignole
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
Marsh Posté le 16-12-2004 à 01:41:48
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)
Marsh Posté le 16-12-2004 à 01:55:16
En tout cas merci, j'ai fais un
Code :
|
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) ??
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.
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:
Avec au prealable un fonction get_line qui fonctionne bien et un TAILLE definie a 256:
-> 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 ?