Couper une chaine de caractere en 2 [RESOLU] [c] - C - Programmation
Marsh Posté le 08-07-2003 à 11:48:11
fais une recherche sur strtok dans ce forum
voila c'est la:
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
Marsh Posté le 08-07-2003 à 11:58:43
Ben, tu peux bien faire la recherche toi même, style :
Code :
|
En principe, ça devrait ê qqch comme ça...
Marsh Posté le 08-07-2003 à 12:05:00
man 3 basename au lieu de réinventer la roue (et d'ailleurs avec un superbe exemple de code ultra-buggé et dangereux)
man 3 basename donc
(si vous voulez les critiques, sur le code: overflow à gogo, memset inutiles, strchr personne connait. etc, pas une ligne sans problème. désolé Elg )
Marsh Posté le 08-07-2003 à 12:22:00
++Taz a écrit : man 3 basename au lieu de réinventer la roue (et d'ailleurs avec un superbe exemple de code ultra-buggé et dangereux) |
strchr trouve la 1ère occurence, on veut la dernière. Alors à moins d'inverser la chaine avant, je n'vois pas bien à quoi il pourrait nous servir.
les memset, il vaut mieux en faire trop que pas assez, ça n'coute rien (ou si peu).
et overflow, où ça ? (là, rien ne m'empêche d'utiliser strcpy et strlen sans risque d'overflow : je contrôle ma chaine de char, je sais qu'elle ne dépasse pas)
Marsh Posté le 08-07-2003 à 12:24:32
El_gringo a écrit : |
ca mériterait presque une fortune
Marsh Posté le 08-07-2003 à 12:25:30
strrchr désolé...allez laisse tomber ton code est mauvais...
Marsh Posté le 08-07-2003 à 12:30:42
++Taz a écrit : strrchr désolé...allez laisse tomber ton code est mauvais... |
à, ça j'connaissais pas.
En général de toute façon, sans compilo, j'fais toujours des fautes toutes nulles. Mais sinon, en quoi il est si mauvais ce code ?
Marsh Posté le 08-07-2003 à 12:39:16
ben je te trouve tres presomptueux avec tableaux et tes nombres magiques. les memset sont completement inutiles. enfin, c'est de toutes façons quelque chose du ressort du système. basename fait d'ailleurs bien mieux le boulot
chemin dirname basename
"/usr/lib" "/usr" "lib"
"/usr/" "/" "usr"
"usr" "." "usr"
"/" "/" "/"
"." "." "."
".." "." ".."
gaffe, c'est pas réentrant
Marsh Posté le 08-07-2003 à 13:13:47
Citation : et overflow, où ça ? (là, rien ne m'empêche d'utiliser strcpy et strlen sans risque d'overflow : je contrôle ma chaine de char, je sais qu'elle ne dépasse pas) |
Préfère déjà strncpy à strcpy.
Ensuite, avec ton code, que se passe-t-il si on copie un chemin de 600 caractères, avec comme nom de fichier final .../toto.fic ?
Marsh Posté le 08-07-2003 à 13:37:34
++Taz a écrit : je serais d'avis pour marquer ce topic résolu |
surtout aue j'ai propose strtok des le depart, ce qui est la meilleure solution vue jusqu'ici
Marsh Posté le 08-07-2003 à 13:41:01
polo021 a écrit : |
n'importe quoi. la solution de elg est mal implémentée, mais c'est la solution si on ne veut pas utiliser basename (pourquoi s'en priver d'ailleurs, bordel, ce topic est un topic unix et rien d'autre!!!)
Marsh Posté le 08-07-2003 à 13:49:15
++Taz a écrit : n'importe quoi. la solution de elg est mal implémentée, mais c'est la solution si on ne veut pas utiliser basename (pourquoi s'en priver d'ailleurs, bordel, ce topic est un topic unix et rien d'autre!!!) |
et strtok va pas sous unix
Marsh Posté le 08-07-2003 à 13:51:30
polo021 a écrit : |
si, mais pourquoi se faire chier a réimplémenter la roue bordaille
Marsh Posté le 08-07-2003 à 14:13:19
Ben, en fait au départ, j'allais répondre pour Windows (jusqu'a aujourd'hui, j'ai fais que de la prog ss Windows).
Pour les tailles de mes chaines, j'aurais donc fait :
Code :
|
Là, à priori, on est sur que la chaine est terminée par un caractère null (et pas d'overflow, et strcpy est ok, et strlen aussi). Du coup j'me suis un peu merdé. Et du coup, en C ss unix, on fait quoi pour être sur de ne jamais avoir une chaine trop grande ? Gestion dynamique de la mémoire ? Enfin, c'est vrai que j'me suis un peu merdé là...
Pour les memset, jusqu'a maintenant, dans le doute, j'initialisais toujours mes chaines avant de les utiliser. C pas la peine, les standard du C disent que l'espace mémoire réservé est forcément mis à 0 ?
Et la solution de basename, c'est pasz ANSI ça. 'vaut mieux écrire du standard autant que possible, surtout quand la solution ANSI est simple, vs croyez pas ?
Marsh Posté le 08-07-2003 à 14:13:26
lorill a écrit : |
strtok, c'est la roue
Marsh Posté le 08-07-2003 à 14:15:01
polo021 a écrit : |
Ben, c'est pas ça, mais strtok, ça fait faire la recherche dans la mauvais sens. Vu ce qu'il veut faire, ça parait plus logique de partir de la fin de la chaine. Donc strrchr (que j'avais raté) parait + approprié...
Marsh Posté le 08-07-2003 à 14:17:52
El_gringo a écrit : |
non parce qu'ici on fait de la programmation système.
edit: avec ton raisonnement, on peut allez tres tres loin...
edit2: on a pas la meme definition de la simplicité
edit3: la C ANSI ne connait pas la notion de répertoire...
Marsh Posté le 08-07-2003 à 14:20:54
El_gringo a écrit : |
Il n'a qu'a faire une boucle et ne prendre que la derniere valeur retournee, c'est pas bien complique.
Enfin maintenant il a l'embarras du choix
Marsh Posté le 08-07-2003 à 14:25:30
tout ça parce que psebcopathe alambiqué son 'je suis sous linux, je voudrais à partir d'un chemain d'acces obtenir le répertoire d'une part et d'autre part le nom du fichier'
Marsh Posté le 08-07-2003 à 14:33:35
++Taz a écrit : tout ça parce que psebcopathe alambiqué son 'je suis sous linux, je voudrais à partir d'un chemain d'acces obtenir le répertoire d'une part et d'autre part le nom du fichier' |
21 posts pour ça, ça fait un peu beaucoup, certes...
Mais tu m'as pas répondu :
du moment qu'on réserve un espace mémoire, on peut être sur qu'il est initialisé à 0 ?
Marsh Posté le 08-07-2003 à 14:35:07
non. dans notre cas, on s'en fiche. et pour traiter des chaines de caracteres en C, un simple *tab=0 suffit si tu flippes. sinon fait marcher calloc
Marsh Posté le 08-07-2003 à 14:37:47
sous windows c'est :
PathRemoveFileSpec() et PathFindFileName()
Marsh Posté le 08-07-2003 à 14:38:20
ReplyMarsh Posté le 08-07-2003 à 14:39:07
++Taz a écrit : non. dans notre cas, on s'en fiche. et pour traiter des chaines de caracteres en C, un simple *tab=0 suffit si tu flippes. sinon fait marcher calloc |
Ben, *tab = 0, ça n'sert pas à grand chose dans le cas dont j'ai parlé (ou je peux me permettre d'utiliser strlen et compagnie grace aux _MAX_PATH et autre _MAX_ de Windows).
Et puis, calloc et malloc, franchement, c du pareil au même. Simple question de gouts...
Marsh Posté le 08-07-2003 à 14:40:19
El_gringo a écrit : |
c'est toi qui flippe au point de faire du memset plus que raison et t'aimes pas calloc?
Marsh Posté le 08-07-2003 à 14:40:21
Konar a écrit : sous windows c'est : |
Ouais. Enfin, j'essayais de m'adapater autant que j'le pouvais a son cas Unix.
Bref, je m'incline...
Marsh Posté le 08-07-2003 à 14:40:43
El_gringo a écrit : |
calloc initialise l'espace alloue a 0 d'apres le type de ta variable
malloc ne fait rien lui
Marsh Posté le 08-07-2003 à 14:43:10
polo021 a écrit : |
kwotaid
edit: elg, reviens ici
Marsh Posté le 08-07-2003 à 14:44:00
polo021 a écrit : |
à, ça j'savais pas !
Marsh Posté le 08-07-2003 à 14:45:02
++Taz a écrit : kwotaid |
Pourquoi, Qué passa ?
Marsh Posté le 08-07-2003 à 14:46:50
El_gringo a écrit : |
donc sous linux/unix, la solution est strtok ? (surtout pas basename, ca doit pas marcher)
hihihi je kiffes.
Marsh Posté le 08-07-2003 à 14:46:58
++Taz a écrit : bon, qui calcule le rapport signal/bruit de ce topic |
...Beaucoup de bruit pour pas grand chose !? c ça que tu veux dire ?
Humm, t'as pas franchement tord !
Marsh Posté le 08-07-2003 à 14:47:50
Konar a écrit : |
gné?
Marsh Posté le 08-07-2003 à 14:48:14
El_gringo a écrit : |
c'est sur que t'a appris beaucoup aujourd'hui
Marsh Posté le 08-07-2003 à 14:48:28
Konar a écrit : |
Sans "s" le kiffe...
Hé, le strtok, c'est pas de moi !
Et basename, je me tue à dire que j'connaissais pas (sans faire de prog Unix, ça parait plutôt logique, non !?)
Marsh Posté le 08-07-2003 à 11:34:34
J'ai beau chercher sur le forum , g pas trouvé de réponse en C .
Pour info , le délire ce passe sous linux et ce que je veux faire c'est couper la chaine suivante par exemple : /home/seb/media/monfilm.avi en /home/seb/media et monfilm.avi
sachant que ces chaines ne sont jamais constantes , cela peut etre :
/mnt/cdrom/dir2/rep2/monfilm.avi et je vousdrais /mnt/cdrom/dir2/rep2 et monfilm.avi .
g essayé de voir avec la fonction strstr mais j'y arrive pas a trouver comment dire on separe la chaine de caractere qui suit le dernier "/"
merci de votre aide.
Message édité par psebcopathe le 08-07-2003 à 16:13:22