[c] Couper une chaine de caractere en 2 [RESOLU]

Couper une chaine de caractere en 2 [RESOLU] [c] - C - Programmation

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
Reply

Marsh Posté le 08-07-2003 à 11:34:34   

Reply

Marsh Posté le 08-07-2003 à 11:48:11    


fais une recherche sur strtok dans ce forum  :hello:
voila c'est la:
http://forum.hardware.fr/forum2.ph [...] h=&subcat=


Message édité par polo021 le 08-07-2003 à 11:53:38
Reply

Marsh Posté le 08-07-2003 à 11:58:43    

Ben, tu peux bien faire la recherche toi même, style :

Code :
  1. char szKifkif[1024];
  2. char szBouricot1[512];
  3. char szBouricot2[512];
  4. memset (szKifkif, 0, sizeof (szKifkif));
  5. memset (szBouricot1, 0, sizeof (szBouricot1));
  6. memset (szBouricot2, 0, sizeof (szBouricot2));
  7. // ça, c juste pr l'exemple
  8. strcpy (szKifkif, "/mnt/cdrom/dir2/rep2/monfilm.avi" );
  9. // Initialisations
  10. int iKikifLength = strlen (szKifkif);
  11. int iLastSlash = iKikifLength ;
  12. char cLookedFor = '/';
  13. // Recherche de la dernière occurence du caractère
  14. for (; iLastSlash >= 0; iLastSlash--)
  15.    if (szKifkif[iLastSlash] == cLookedFor)
  16.       break;
  17. // Découpage selon la position trouvée
  18. strncpy (szBouricot1, szKifkif, iKikifLength - iLastSlash);
  19. strcpy (szBouricot2, szKifkif + (iKikifLength - iLastSlash));


 
En principe, ça devrait ê qqch comme ça...

Reply

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   [:tomtom75] )

Reply

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)
 
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   [:tomtom75] )


 
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)

Reply

Marsh Posté le 08-07-2003 à 12:24:32    

El_gringo a écrit :


les memset, il vaut mieux en faire trop que pas assez


[:wam]
 
ca mériterait presque une fortune

Reply

Marsh Posté le 08-07-2003 à 12:25:30    

strrchr désolé...allez laisse tomber ton code est mauvais...

Reply

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 ? [:sisicaivrai]

Reply

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

Reply

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 ?
 


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 08-07-2003 à 13:13:47   

Reply

Marsh Posté le 08-07-2003 à 13:16:41    

je serais d'avis pour marquer ce topic résolu

Reply

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

Reply

Marsh Posté le 08-07-2003 à 13:41:01    

polo021 a écrit :


surtout aue j'ai propose strtok des le depart, ce qui est la meilleure solution vue jusqu'ici  :o  

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

Reply

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

Reply

Marsh Posté le 08-07-2003 à 13:51:30    

polo021 a écrit :


et strtok va pas sous unix  :??:  


si, mais pourquoi se faire chier a réimplémenter la roue bordaille :fou:

Reply

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 :
  1. char szKifkif[_MAX_PATH+1];
  2. char szBouricot1[_MAX_DIR+1];
  3. char szBouricot2[_MAX_FNAME+1];


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à... :sweat:  
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 ?

Reply

Marsh Posté le 08-07-2003 à 14:13:26    

lorill a écrit :


si, mais pourquoi se faire chier a réimplémenter la roue bordaille :fou:


strtok, c'est la roue  :o

Reply

Marsh Posté le 08-07-2003 à 14:15:01    

polo021 a écrit :


et strtok va pas sous unix  :??:  


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

Reply

Marsh Posté le 08-07-2003 à 14:15:13    

et basename PUTAIN  :o  :o  :o  :o  :o

Reply

Marsh Posté le 08-07-2003 à 14:17:52    

El_gringo a écrit :


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 ?

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


Message édité par Taz le 08-07-2003 à 14:19:24
Reply

Marsh Posté le 08-07-2003 à 14:20:54    

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


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

Reply

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'


Message édité par Taz le 08-07-2003 à 14:25:38
Reply

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 ?

Reply

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

Reply

Marsh Posté le 08-07-2003 à 14:37:47    

sous windows c'est :
PathRemoveFileSpec() et PathFindFileName()

Reply

Marsh Posté le 08-07-2003 à 14:38:20    

Konar a écrit :

sous windows c'est :
PathRemoveFileSpec() et PathFindFileName()

:jap:

Reply

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

Reply

Marsh Posté le 08-07-2003 à 14:40:19    

El_gringo a écrit :


Et puis, calloc et malloc, franchement, c du pareil au même. Simple question de gouts...

:heink: c'est toi qui flippe au point de faire du memset plus que raison et t'aimes pas calloc?

Reply

Marsh Posté le 08-07-2003 à 14:40:21    

Konar a écrit :

sous windows c'est :
PathRemoveFileSpec() et PathFindFileName()


 
Ouais. Enfin, j'essayais de m'adapater autant que j'le pouvais a son cas Unix.
Bref, je m'incline... :jap:

Reply

Marsh Posté le 08-07-2003 à 14:40:43    

El_gringo a écrit :


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


calloc initialise l'espace alloue a 0 d'apres le type de ta variable :o  
malloc ne fait rien lui

Reply

Marsh Posté le 08-07-2003 à 14:41:27    

bon, qui calcule le rapport signal/bruit de ce topic :whistle:

Reply

Marsh Posté le 08-07-2003 à 14:43:10    

polo021 a écrit :


calloc initialise l'espace alloue a 0 d'apres le type de ta variable :o  
malloc ne fait rien lui

kwotaid
 
edit: elg, reviens ici  :bounce:


Message édité par Taz le 08-07-2003 à 14:43:55
Reply

Marsh Posté le 08-07-2003 à 14:44:00    

polo021 a écrit :


calloc initialise l'espace alloue a 0 d'apres le type de ta variable :o  
malloc ne fait rien lui


 
à, ça j'savais pas !

Reply

Marsh Posté le 08-07-2003 à 14:45:02    

++Taz a écrit :

kwotaid
 
edit: elg, reviens ici  :bounce:  


 
Pourquoi, Qué passa ?


Message édité par El_gringo le 08-07-2003 à 14:45:54
Reply

Marsh Posté le 08-07-2003 à 14:46:50    

El_gringo a écrit :


 
Ouais. Enfin, j'essayais de m'adapater autant que j'le pouvais a son cas Unix.
Bref, je m'incline... :jap:  


 
donc sous linux/unix, la solution est strtok ? (surtout pas basename, ca doit pas marcher)
 
hihihi je kiffes.

Reply

Marsh Posté le 08-07-2003 à 14:46:58    

++Taz a écrit :

bon, qui calcule le rapport signal/bruit de ce topic :whistle:  


 
...Beaucoup de bruit pour pas grand chose !? c ça que tu veux dire ?
Humm, t'as pas franchement tord !

Reply

Marsh Posté le 08-07-2003 à 14:47:50    

Konar a écrit :


 
donc sous linux/unix, la solution est strtok ? (surtout pas basename, ca doit pas marcher)
 
hihihi je kiffes.

gné?

Reply

Marsh Posté le 08-07-2003 à 14:48:14    

El_gringo a écrit :


 
...Beaucoup de bruit pour pas grand chose !? c ça que tu veux dire ?
Humm, t'as pas franchement tord !

c'est sur que t'a appris beaucoup aujourd'hui  :D

Reply

Marsh Posté le 08-07-2003 à 14:48:28    

Konar a écrit :


 
donc sous linux/unix, la solution est strtok ? (surtout pas basename, ca doit pas marcher)
 
hihihi je kiffes.


 
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 !?)

Reply

Marsh Posté le 08-07-2003 à 14:49:00    

tu pouvais pas deviner que c'etait pour système Unix :heink:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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