Séparer nom de fichier et extension, en C |
Bienvenue invité ( Connexion | Inscription )
Il est interdit de poster directement à la racine de ce forum.
Veuillez créer votre topic dans le sous-forum approprié.
Séparer nom de fichier et extension, en C |
17 Jul 2004, 03:50
Message
#1
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 1 599 Inscrit : 20 Sep 2003 Membre no 9 702 |
Bonjour,
j'ai un nom de fichier contenu dans un char*, sous la forme "nom.ext", et je voudrais séparer le nom de l'extension. Comment est-ce que je peux faire? J'ai essayé le code suivant, mais j'ai un "bus error" au moment de l'exécution dans un terminal: CODE #include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[]) { char *test = "nom.ext"; char *name; char *ext; printf("%s\n", test); sscanf(test, "%s.%s", name, ext); printf("%s %s\n", name, ext); return 0; } -------------------- |
|
|
17 Jul 2004, 06:41
Message
#2
|
|
Macbidouilleur d'Or ! Groupe : Modérateurs Messages : 3 818 Inscrit : 15 Mar 2004 Lieu : Région Parisienne Membre no 16 307 |
Attention, c'est ma première intervention ici - je suis pas trop calé
enfin ça va se voir
J'ai l'impression qu'un problème pourrait venir de la déclaration de tes chaînes name et ext. Elles pointent nulle part Il faut soit passer par un malloc ou sinon par exemple : CODE char name[257]; // c'est bien 256 car max, non ? char ext[4]; // quoique certaines extensions font plus de 3 caractères et sscanf n'a pas l'air de fonctionner comme tu l'utilises Tu peux faire ça : (d'autant que ça te permettra les noms avec espaces) CODE sscanf(test, "%[^.]%s", name, ext); mais tu te récupères le point dans ext donc faudrait allonger d'autant la chaîne Y'a peut-être mieux aussi que de passer par sscanf, non ? vite, un contradicteur edit: fautes Ce message a été modifié par pardon - 17 Jul 2004, 08:15. -------------------- Riez, riez,
|
|
|
17 Jul 2004, 08:25
Message
#3
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 275 Inscrit : 8 Jan 2002 Lieu : Lyon Membre no 1 787 |
Bon déjà arty a raison ton bus error viens clairement du fait que tu n'a pas alloué de memoire, en plus ton sscanf est mal écrit donc même sans le bus error tu va récupérer n'importe quoi donc voila:
CODE #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char *test; char *name; char *ext; test = (char*)malloc(sizeof(char) * 100); //nom max de 100 charactère name = (char*)malloc(sizeof(char) * 90); ext = (char*)malloc(sizeof(char) * 10); memset(test,0,100); memset(name,0,90); //inutile sous OS X car avec un malloc il met tout à 0 memset(ext,0,10); //préférable sous linux si tu ne veut pas avoir de surprise strcpy(test,"nom.ext"); printf("%s\n", test); sscanf(test, "%[^.]%s", name, ext); printf("%s %s\n", name, ext); return 0; } tu ne devrait pas avoir de pbs là -------------------- Imac core2duo 3Ghz, 4Go RAM, 1To, ATI 4850, OS X.6, numericable
Capgemini |
|
|
17 Jul 2004, 10:54
Message
#4
|
|
Macbidouilleur d'Or ! Groupe : Modérateurs Messages : 3 818 Inscrit : 15 Mar 2004 Lieu : Région Parisienne Membre no 16 307 |
QUOTE (thdevita @ 17 Jul 2004, 09:25) Bon déjà pardon a raison
si je puis me permettre Bon, mais je vois pas l'intérêt de tes malloc là Je ne vois pas ce que ça apporte de plus qu'une déclaration du type que je proposais Quand j'ai évoqué d'utiliser cette fonction, c'était dans le cas où Arty aurait voulu grapiller quelques octets en faisant ses variables nom et ext sur mesure (mais il n'y a pas franchement d'intérêt) en fonction de la chaîne test, au prix d'un strlen et de la localisation du '.' Un truc dans ce genre-là (au warning près) : mais bon, on a vu mieux, hein - rigolez pas CODE #include <stdio.h> #include <stdlib.h> #include <string.h> char **nomext(char *); int main() { char *test = "nom fichier.xxx"; char **nmxt; nmxt = nomext(test); printf("<%s> => <%s> <%s>\n", test, nmxt[0], nmxt[1]); return 0; } char **nomext(char *src){ char *nom,*ext,*res[2]; int len = strlen(src); int p = 0; while(*(src+len-p) != '.') p++; nom = (char *) malloc( (len-p+1) * sizeof(char)); ext = (char *) malloc( (p+1) * sizeof(char)); sscanf(src, "%[^.] %s", nom, ext); res[0] = nom; res[1] = ext+1; // résoud l'histoire du point return((char **) res); } parce que sinon, il suffit de remplacer les 3 lignes que j'ai indiqué dans le premier post (au détail près toujours du '.' qui demeure) Ce message a été modifié par pardon - 17 Jul 2004, 10:57. -------------------- Riez, riez,
|
|
|
17 Jul 2004, 11:28
Message
#5
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 6 580 Inscrit : 20 Mar 2003 Membre no 6 765 |
Il est très dangereux de retourner des variables allouées dans la pile comme tu le fais avec les pointeurs (char *res[2]). L'appelant de ta fonction, s'il appelle une autre fonction avant de traiter tes données retournées, utilisera des données corrompues.
-------------------- késtananafout' (:
|
|
|
17 Jul 2004, 12:40
Message
#6
|
|
Adepte de Macbidouille Groupe : Membres Messages : 156 Inscrit : 14 Mar 2003 Membre no 6 665 |
Le C c'est tellement moche lorsqu'on manipule des chaînes! Dire qu'en C++ un truc comme ça suffit:
CODE #include <string>
#include <iostream> using namespace std; int main(){ string test = "nom_super.difficile.extension_super_longue"; int p = test.find_last_of('.',test.size()); string nom = test.substr(0, p); string extension = test.substr(p+1, test.size()-p-1); return 0; } -------------------- Macbook Core 2 Duo 2,16GHz 2Gb (blanc) - Powerbook G4 867MHz 768 Mb - iMac Core Duo 17'' 1.83 GHz (maison)...
|
|
|
17 Jul 2004, 13:46
Message
#7
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 1 599 Inscrit : 20 Sep 2003 Membre no 9 702 |
Merci pour vos réponse, ça répond à ma question.
-------------------- |
|
|
17 Jul 2004, 13:50
Message
#8
|
|
Moderating Daemon Groupe : Modérateurs Messages : 6 345 Inscrit : 22 Feb 2004 Lieu : Yvelines/Cambridge (GB), dans mon pantalon Membre no 15 207 |
Le C c'est pas moche non plus.
CODE #include <string.h> #include <stdlib.h> void main(void){ char *machin="au clair de la lune.chanson"; char *extension,*nom; char *p; p=strrchr(machin,'.'); if(p){ asprintf(&extension,"%s",p+1); asprintf(&nom,"%.*s",(unsigned int)p-(unsigned int)machin,machin); } } ne pas oublier de faire un free . -------------------- G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A MacBook core duo 1.83 GHz |
|
|
Nous sommes le : 30th May 2024 - 13:42 |