fonction qui renvoie les 4 derniers caractères en vc++ ?

fonction qui renvoie les 4 derniers caractères en vc++ ? - C++ - Programmation

Marsh Posté le 21-11-2006 à 16:28:31    

Salut à tous
 
j´essaye d´ecrire une fonction qui copie les 4 derrnies charactères d´une string et me les renvois,
mais car ne fonctionne pas dut tout, voici mon code.
 
Quelqu´un saurait peut être ou je fais ma betise ???
 

Code :
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. char * GetExtensionFile (char* FileName)
  5. {
  6. char* FileExt ='\0';
  7. int i_cnt_path;
  8. int i_cnt = 0;
  9. i_cnt_path = strlen(FileName)-4;
  10. while(FileName[i_cnt_path] != '\0'){
  11.  FileExt[i_cnt] = FileName[i_cnt_path];
  12.  i_cnt++;
  13.  i_cnt_path++;
  14. }
  15.  FileExt[i_cnt] = FileName[i_cnt_path];
  16.  return FileExt;
  17. }
  18. int main ()      
  19. {
  20.  
  21.  char * Ext;
  22.  char * path;
  23.      cout<<"entrer le chemin"<<endl;
  24.      cin>>path;
  25.   Ext = GetExtensionFile(path);
  26.   cout<<Ext<<endl;
  27.  return 0;
  28. }


 
Merci bien !!

Reply

Marsh Posté le 21-11-2006 à 16:28:31   

Reply

Marsh Posté le 21-11-2006 à 16:30:38    

Tu enlèves tout ces char* qui n'ont rien à faire là, tu fais un objet pour ça, tu utilises CString et les méthodes Left ou Right de cette classe.


---------------
Töp of the plöp
Reply

Marsh Posté le 21-11-2006 à 16:45:45    

tu peux aussi utiliser std::string avec substr pour etre portable


---------------
Töp of the plöp
Reply

Marsh Posté le 21-11-2006 à 17:45:47    

Scan arrière, pour trouver l'extension finale comme dans "la.notation.hongroise.doit.mourir"

Code :
  1. char *GetExtensionFile(char *FileName) {
  2. if (FileName)
  3.  for (int i=std::strlen(FileName)-1; i>=0; --i)
  4.   if (FileName[i] == '.')
  5.    return &FileName[i];
  6. return 0;
  7. }


 
Evidement strlen part dans les choux si l'argument n'est pas une chaine bien formée.
 
edit: Crotte. Marche pas avec '..'
Il est fortement conseillé de ne pas se lancer dans les manips de chaines, sauf à fins didactiques, avec la bibiothèque C standard. C'est vraiment casse gueule.


Message édité par tbp le 21-11-2006 à 17:55:43
Reply

Marsh Posté le 21-11-2006 à 18:37:20    

Code :
  1. char *ext = strrchr(filename, '.');
  2. if (ext != NULL)
  3.   ++ext;

Reply

Marsh Posté le 21-11-2006 à 20:55:52    

Oui, mais non; std::strrchr(0, '.'), c'est verbotten.
 
L'auteur initial n'utilisait que strlen, si on pouvait éviter de lui montrer comment faire un coredump en moins de 3 lignes avec strtok et compagnie ça serait un plus, nan?
 

Code :
  1. char *ext = filename ? std::strrchr(filename, '.') + 1 : 0;


 
edit: Cette ligne est tout aussi foireuse, heh.

Message cité 1 fois
Message édité par tbp le 21-11-2006 à 21:09:36
Reply

Marsh Posté le 21-11-2006 à 21:01:20    

tbp a écrit :

Oui, mais non; std::strrchr(0, '.'), c'est verbotten.
 
L'auteur initial n'utilisait que strlen, si on pouvait éviter de lui montrer comment faire un coredump en moins de 3 lignes avec strtok et compagnie ça serait un plus, nan?
 

Code :
  1. char *ext = filename ? std::strrchr(filename, '.') + 1 : 0;



+1

Reply

Marsh Posté le 22-11-2006 à 08:25:05    

Ton erreur est ici

Code :
  1. char * GetExtensionFile (char* FileName)
  2. {
  3.     char* FileExt ='\0';    int i_cnt_path;
  4.     int i_cnt = 0;
  5.     i_cnt_path = strlen(FileName)-4;
  6.      while(FileName[i_cnt_path] != '\0'){
  7.             FileExt[i_cnt] = FileName[i_cnt_path];
  8.         i_cnt++;
  9.         i_cnt_path++;
  10.     }
  11.       FileExt[i_cnt] = FileName[i_cnt_path];
  12.      return FileExt;
  13. }

FileExt est un pointeur non initialisé. D'ailleurs ton compilo aurait du râler ici : char* FileExt ='\0';
FileExt[i_cnt] pointe dans le décor, ça peut fonctionner comme ça peut planter.
 

Reply

Marsh Posté le 22-11-2006 à 09:38:22    

Merci bien, j´ai pu m´inspirer de vos multiples réponses pour faire ceci et ca marche nickel.
 

Code :
  1. std::string GetExtensionFile(std::string FileName)
  2. {
  3. int beginIndex  = FileName.length();
  4. int endIndex  = FileName.length();
  5.     return FileName.substr(beginIndex-4,endIndex);
  6. }


 
cool ou bien ?
je vous remercie

Message cité 1 fois
Message édité par alino le 22-11-2006 à 09:39:26
Reply

Marsh Posté le 22-11-2006 à 09:47:17    

alino a écrit :

Merci bien, j´ai pu m´inspirer de vos multiples réponses pour faire ceci et ca marche nickel.
 

Code :
  1. std::string GetExtensionFile(std::string FileName)
  2. {
  3. int beginIndex  = FileName.length();
  4. int endIndex  = FileName.length();
  5.     return FileName.substr(beginIndex-4,endIndex);
  6. }


 
cool ou bien ?
je vous remercie


 
Oui, c'est déjà beaucoup mieux


---------------
Töp of the plöp
Reply

Marsh Posté le 22-11-2006 à 09:47:17   

Reply

Marsh Posté le 22-11-2006 à 09:54:55    

Que se passe-t-il quand FileName.length() < 4?
 
Tout ce qui rentre dans un programme est contaminé.

Reply

Marsh Posté le 22-11-2006 à 10:21:30    

ben naya, je suis déja sur et certains que c´est superieux car je recois le chemin ou se trouve les données et au minimun c:\share\filename.txt
 
et moi c extension si m´interesse pour faire
 

Code :
  1. if (jpeg)
  2. {
  3. showimage //.jpg
  4. }
  5. else if
  6. {
  7. showHTML //.htm
  8. }
  9. else
  10. {
  11. playvideo //.mpv
  12. }


c tout.

Reply

Marsh Posté le 22-11-2006 à 10:25:32    

Du moment que vous vous êtes posé la question, c'est RAS dans le talveg.

Reply

Marsh Posté le 22-11-2006 à 11:56:18    

Et si t'as un fichier dont l'extension fait plus de 3 lettres? (html par exemple, ou quelques autres variantes du type jpeg)

Reply

Marsh Posté le 22-11-2006 à 13:20:43    

correct là ca devient chaud ??

Reply

Marsh Posté le 22-11-2006 à 13:28:31    

heu....
Si tu te bases sur l'extension, il me semble qu'il suffit de prendre tout ce qu'il y a après le dernier point (.) dans le nom complet d'acces au fichier, non ?
 
(utiliser rfind et substr je pense)

Reply

Marsh Posté le 22-11-2006 à 13:41:02    

Encore plus drôle que les extentions de plus de 4 caractères, les blablah.tar.bz2 , qui ont un mimetype spécifique et différent des blablah.bz2 ;)


Message édité par 0x90 le 22-11-2006 à 14:00:12
Reply

Marsh Posté le 22-11-2006 à 14:41:08    

alino a écrit :

correct là ca devient chaud ??


En même temps le problème a été évoqué 10 posts plus haut. Faudrait voir à percuter.

Reply

Marsh Posté le 22-11-2006 à 17:18:29    

blablah.tar.bz2 ca c est pour moi un cas extrême !! il n´arrivera pas de toutes les facons car c est trop spécifique mais celui ci pourra bien arriver  
.html ou . js ou .mpeg

Reply

Sujets relatifs:

Leave a Replay

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