IPB

Bienvenue invité ( Connexion | Inscription )

> Programmation

Il est interdit de poster directement à la racine de ce forum.
Veuillez créer votre topic dans le sous-forum approprié.

 
Reply to this topicStart new topic
> Séparer nom de fichier et extension, en C
Options
Arty
posté 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;
}


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
pardon
posté 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 ph34r.gif


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 unsure.gif
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 unsure.gif
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 ? unsure.gif


vite, un contradicteur ph34r.gif


edit: fautes

Ce message a été modifié par pardon - 17 Jul 2004, 08:15.


--------------------
Riez, riez, …
Go to the top of the page
 
+Quote Post
thdevita
posté 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à cool.gif


--------------------
Imac core2duo 3Ghz, 4Go RAM, 1To, ATI 4850, OS X.6, numericable
Capgemini
Go to the top of the page
 
+Quote Post
pardon
posté 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 cool.gif


Bon, mais je vois pas l'intérêt de tes mallocunsure.gif
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 ph34r.gif
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) unsure.gif

Ce message a été modifié par pardon - 17 Jul 2004, 10:57.


--------------------
Riez, riez, …
Go to the top of the page
 
+Quote Post
chombier
posté 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' (:
Go to the top of the page
 
+Quote Post
l0wc0der
posté 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)...
Go to the top of the page
 
+Quote Post
Arty
posté 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.


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
f_cam
posté 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 27th April 2024 - 04:48