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

  FORUM HardWare.fr
  Programmation
  C

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

 



 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

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

n°450921
psebcopath​e
Posté le 08-07-2003 à 11:34:34  profilanswer
 

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
mood
Publicité
Posté le 08-07-2003 à 11:34:34  profilanswer
 

n°450942
polo021
Posté le 08-07-2003 à 11:48:11  profilanswer
 


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
n°450947
El_gringo
Posté le 08-07-2003 à 11:58:43  profilanswer
 

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

n°450952
Taz
bisounours-codeur
Posté le 08-07-2003 à 12:05:00  profilanswer
 

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

n°450959
El_gringo
Posté le 08-07-2003 à 12:22:00  profilanswer
 

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

n°450963
lorill
Posté le 08-07-2003 à 12:24:32  profilanswer
 

El_gringo a écrit :


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


[:wam]
 
ca mériterait presque une fortune

n°450965
Taz
bisounours-codeur
Posté le 08-07-2003 à 12:25:30  profilanswer
 

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

n°450969
El_gringo
Posté le 08-07-2003 à 12:30:42  profilanswer
 

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

n°450981
Taz
bisounours-codeur
Posté le 08-07-2003 à 12:39:16  profilanswer
 

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

n°451001
HelloWorld
Salut tout le monde!
Posté le 08-07-2003 à 13:13:47  profilanswer
 

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
mood
Publicité
Posté le 08-07-2003 à 13:13:47  profilanswer
 

n°451003
Taz
bisounours-codeur
Posté le 08-07-2003 à 13:16:41  profilanswer
 

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

n°451035
polo021
Posté le 08-07-2003 à 13:37:34  profilanswer
 

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

n°451042
Taz
bisounours-codeur
Posté le 08-07-2003 à 13:41:01  profilanswer
 

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

n°451055
polo021
Posté le 08-07-2003 à 13:49:15  profilanswer
 

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

n°451059
lorill
Posté le 08-07-2003 à 13:51:30  profilanswer
 

polo021 a écrit :


et strtok va pas sous unix  :??:  


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

n°451099
El_gringo
Posté le 08-07-2003 à 14:13:19  profilanswer
 

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 ?

n°451100
polo021
Posté le 08-07-2003 à 14:13:26  profilanswer
 

lorill a écrit :


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


strtok, c'est la roue  :o

n°451102
El_gringo
Posté le 08-07-2003 à 14:15:01  profilanswer
 

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

n°451103
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:15:13  profilanswer
 

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

n°451109
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:17:52  profilanswer
 

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
n°451110
polo021
Posté le 08-07-2003 à 14:20:54  profilanswer
 

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

n°451115
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:25:30  profilanswer
 

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
n°451123
El_gringo
Posté le 08-07-2003 à 14:33:35  profilanswer
 

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

n°451125
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:35:07  profilanswer
 

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

n°451128
Konar
Posté le 08-07-2003 à 14:37:47  profilanswer
 

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

n°451129
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:38:20  profilanswer
 

Konar a écrit :

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

:jap:

n°451130
El_gringo
Posté le 08-07-2003 à 14:39:07  profilanswer
 

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

n°451131
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:40:19  profilanswer
 

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?

n°451132
El_gringo
Posté le 08-07-2003 à 14:40:21  profilanswer
 

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:

n°451133
polo021
Posté le 08-07-2003 à 14:40:43  profilanswer
 

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

n°451135
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:41:27  profilanswer
 

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

n°451139
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:43:10  profilanswer
 

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
n°451143
El_gringo
Posté le 08-07-2003 à 14:44:00  profilanswer
 

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 !

n°451144
El_gringo
Posté le 08-07-2003 à 14:45:02  profilanswer
 

++Taz a écrit :

kwotaid
 
edit: elg, reviens ici  :bounce:  


 
Pourquoi, Qué passa ?


Message édité par El_gringo le 08-07-2003 à 14:45:54
n°451148
Konar
Posté le 08-07-2003 à 14:46:50  profilanswer
 

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.

n°451149
El_gringo
Posté le 08-07-2003 à 14:46:58  profilanswer
 

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

n°451152
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:47:50  profilanswer
 

Konar a écrit :


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

gné?

n°451153
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:48:14  profilanswer
 

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

n°451154
El_gringo
Posté le 08-07-2003 à 14:48:28  profilanswer
 

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

n°451155
Taz
bisounours-codeur
Posté le 08-07-2003 à 14:49:00  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

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

 

Sujets relatifs
[MFC][RESOLU] CList, c'est quoi ce bug ??[Résolu] Sessions PHP et Validation
Envoyer une URL similaire à "mailto" [Résolu]Mysql : Sélection intelligente dans de très grosses bases [résolu]
[OPENGL] Créer un fichier .raw [RESOLU][C++ / OpenGL] tranformer une couleur de HPEN en RGB [résolu]
prob: getimagesize() et chaîne de caractère[Résolu] Définir la taille d'un JButton ?
[RESOLU]Type incompatible dans une requête 
Plus de sujets relatifs à : [c] Couper une chaine de caractere en 2 [RESOLU]


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