Urgent : Probleme avec split d'un string

Résolu
QuakeCoder Messages postés 17 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 10 août 2005 - 9 août 2005 à 12:41
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009 - 9 août 2005 à 15:08
salut.

j'ai un char * qui contient "C:\\Documents and Settings\\quick\\Bureau\\Nouveau dossier\\test me.exe"

comment faire pour extraire juste ca => "C:\\Documents and Settings\\hamid\\Bureau\\Nouveau dossier\" ????

j'ai essayer avec strtok et strchr et strrchr mais ca buggg .
apres execution je recoi unfameux message erreur windows qui me demande
d'nvoyer le rapport d'erreur :)

16 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2005 à 13:13
char buf[260];

tu auras copié un fullpathname de fichier dans buf:

char *c = buf + strlen(buf);
while(c >= buf) {
if(*c == '\\') break;
c--;
}
*++c = 0;

si pas de '\\' dans buf alors sortira vide.

ciao...
BruNews, MVP VC++
3
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
9 août 2005 à 12:43
parcous la chaine à l'envers et met un '\0' juste avant le premier '\\' recontré !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
QuakeCoder Messages postés 17 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 10 août 2005
9 août 2005 à 12:53
Oui j l'ai fais .. mais tjr le meme probleme



-------



char *buffer = "C:\\Documents and Settings\\quick\\Bureau\\Nouveau dossier\\test me.exe";

char * tmp;

int p = strlen(buffer)-1;

strcpy(tmp,buffer);

while (p)

if(chde[p] == '\\')

chde[--p] = '\0';



-------

ya une erreur ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2005 à 12:55
encore une écriture sur pointeur ne pointant nulle part:
strcpy(tmp,buffer);

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
9 août 2005 à 13:05
ta boucle ne va jamais s'arréter, je me trompe ? Puisque tu continue
tant que p et tu ne décrémente p que quand tu trouve le caractère '\\'



Par contre, je ne pige pas trop ce que c ce chde. Ou bien je suis vraiment pas en forme, ou bien il n'arrive de nul part ?

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
QuakeCoder Messages postés 17 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 10 août 2005
9 août 2005 à 13:11
j'ai corrigé mais le meme probleme

----------

char *buffer = "C:\\Documents and Settings\\quick\\Bureau\\Nouveau dossier\\test me.exe";

char * tmp;

int p = strlen(buffer)-1;

strcpy(tmp,buffer);

while (p)

{

if(chde[p] == '\\')

chde[p] = '\0',p=1;

p--;

}

----------



et que dois-je faire pour :

-------------



encore une écriture sur pointeur ne pointant nulle part:

strcpy(tmp,buffer);

--------------



MERCI
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
9 août 2005 à 13:14
Si ton api n'en fourni pas une (mais ca c'est à verifier) implemente toi meme une fonction 'basename' ou 'pathname' ...



#include <string.h>



char * basename( const char *file, char *base )

{

char * const p = strrchr(file, '\\');

size_t pos;



if( ! p )

return NULL;



pos = (size_t)(p - file) + 1;

memcpy(base, file, pos);

base[pos] = '\0';



return base;

}





const char * const file = "C:\\Documents and Settings\\quick\\Bureau\\Nouveau dossier\\test me.exe";

char s[200];



puts( basename(file, s) );
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2005 à 13:14
strcpy(tmp,buffer); je venais de te dire que tu écris nimporte où avec tmp non initialisé.

ciao...
BruNews, MVP VC++
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
9 août 2005 à 13:17
C'est magique les "char *", ca alloue tous seul et ca libere quand il faut
0
QuakeCoder Messages postés 17 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 10 août 2005
9 août 2005 à 13:29
oui voila ca marche maintenant :) avec ce pti bou de code

----------

char *c = buf + strlen(buf);

while(c >= buf) {

if(*c == '\\') break;

c--;

}

*++c = 0;

----------

Merci bq à vous les amis ...
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
9 août 2005 à 13:42
Si buf est déclaré et initialisé comme ca:

char *buf = "C:\\Documents and Settings\\quick\\Bureau\\Nouveau dossier\\test me.exe";



alors c'est buggé, "C:\\Documents and Settings\\quick\\Bureau\\Nouveau
dossier\\test me.exe" est un tableau constant et la norme précise que
l'écriture provoque un comportement indéfini.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2005 à 13:50
pour sur !!! j'ai bien précisé de copier dans un buffer avant.
QuakeCoder> faut de plonger dans un bouquin de C pour comprendre les différences entre buffer, pointeur etc...

ciao...
BruNews, MVP VC++
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
9 août 2005 à 14:14
C'est plus fort que moi ! Je vous propose une version avec la STL de C++ :

#include<string>
#include
using namespace std;

string extraction( string const & str )
{
return str.substr( str.rfind('\\') + 1 );
}

int main()
{
char const * const str = "C:\\Documents \\Nouveau \\test me.exe";
cout << extraction( str ) << endl;
// affiche "test me.exe"
}

Cordialement,
X.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2005 à 14:26
on l'attendait... que dis-je, nous n'osions l'espérer.

y a juste que faudra peut-être qu'il apprenne à coder avant d'employer ces bidules, il y a un temps pour tout.

ciao...
BruNews, MVP VC++
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
9 août 2005 à 14:53
En faite ta fonction fais l'inverse xterminhate. Je me suis aussi
trompé en appelant ma fonction "basename" au lieu de "dirname".



std::string extraction( std::string const & str )

{

std::string::size_type pos;

if( (pos str.rfind('\\')) std::string::npos )

return str;

return str.substr( 0, pos + 1 );

}
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
9 août 2005 à 15:08
Tu as raison ! Dans ce cas, c'est encore plus simple...

string extraction( string const & str ) { return str.substr(0,str.rfind('\\')+1); }

(PS: Quel gros bourin tu es Steeve ;-))
0
Rejoignez-nous