IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

un d�coupage de chaine qui donne des mauvais resultats


Sujet :

C++/CLI

  1. #1
    Membre extr�mement actif
    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    1 022
    D�tails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 1 022
    Par d�faut un d�coupage de chaine qui donne des mauvais resultats
    bonjour,
    j'ai besoin de d�couper une chaine en deux chaines
    mais la d�coupe de la premi�re chaine est n'importe quoi
    J'ai cod� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    		std::string LWord = sWord.substr( 0, npos);
    		std::string pFlex = sWord.substr( npos+1, len);
    		const char* lWord = LWord.c_str();
    		const char* lFlex = pFlex.c_str();
    		strcat_s( (char*)lWord, len, lFlex);
    		pNextToken = (char*)lWord;
    les variables utilis�es
    npos = 4
    len = 9
    les �l�ments de la chaine :
    sWord = {"PASE)/NNP"}
    LWord = {"PASE/NNP"}, ce qui devrait �tre la solution final, mais ce n'est pas le r�sultat de l'op�ration J'attendais PASE.
    pFlex = 0x0D94E564 "", ce que j'attendais /NNP.
    lWord = "red" et l� c'est n'importe quoi???
    qui m'aiguillera sera

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par d�faut
    Salut,

    perso je vois pas comment ce code pourrait donner les r�sultats dont tu parles.
    D'ailleurs si tu le mets dans le main d'un projet de test tu devrais avoir peu ou prou les r�sultats attendus.
    Il doit donc y avoir du code qui interagit avec tes objets/plages m�moires autre que celui pr�sent� ("red\0" !?)

  3. #3
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par d�faut
    • Juste un petit doute: npos est aussi un membre statique de std::string qui signifie "jusqu'au bout de la cha�ne". Selon les using que tu utilises cela pourrait expliquer pourquoi LWord reprend l'int�gralit� de la cha�ne. De m�me npos+1 t'am�nerait apr�s la fin de la cha�ne.
    • Si tu veux obtenir la fin de sWord dans LFlex, il n'est pas n�cessaire de donner deux arguments � substr: s.substr(n) �quivaut � s.substr(n, std::string::npos).
    • En c++ on utilise plut�t const_cast:
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      char* lWord = const_cast<char*>(LWord.c_str());
    • n'oublie pas que tes char* continuent � pointer � l'int�rieur des strings LWord et LFlex; si elles sont modifi�es ou d�truites, comportement non-d�fini...
    • A un moment, si tu pars d'un char* pour parvenir � un char*, le d�tour string ne s'impose plus vraiment, si?

  4. #4
    Membre extr�mement actif
    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    1 022
    D�tails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 1 022
    Par d�faut La solution
    J'ai copi� ton code et je te donne les r�sultats
    mais ensuite j'ai pris l'initiative d'initier les variables
    et je sort avec pNextToken = 0x0D9DE218 "PASE/NNP"
    c'est ce que je veux. il reste a cr�er un mot pour la ).

  5. #5
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par d�faut
    Ce n'est pas le seul point que je soulevais...
    Si la string pour laquelle tu as appel� c_str() est d�truite et que la m�moire a �t� r�allou�e � une autre string qui se termine par red, ton pointeur pourrait pointer � cet endroit-l�.

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    		const char* lWord = LWord.c_str();
    		...
    		strcat_s( (char*)lWord, len, lFlex);
    NON.

    Tu prends ce code, et tu le jettes par la fen�tre. C'est une horreur abominable.
    Et inutile en plus: Pourquoi faire une chose pareille quand on peut faire tout simplement LWord += LFlex?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre extr�mement actif
    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    1 022
    D�tails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 1 022
    Par d�faut J'ai pris en compte ton obsevation
    J'ai pris en compte ton observation
    Je reviendrai donner le r�sultat lorsque je pourrais compiler la suite.
    Ca marhe: merci Medinoc

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 1
    Dernier message: 23/06/2010, 23h52
  2. fonction et son inverse qui donne des r�sultats fauss�s
    Par kifouillou dans le forum G�n�ral JavaScript
    R�ponses: 1
    Dernier message: 26/05/2009, 12h45
  3. D�coupage de chaine avec conservation des s�parateurs
    Par vdelbart dans le forum Collection et Stream
    R�ponses: 7
    Dernier message: 26/10/2007, 16h50
  4. [RSA]Encryption qui donne des fichiers vides
    Par Janitrix dans le forum S�curit�
    R�ponses: 5
    Dernier message: 27/05/2007, 01h36
  5. insertin d'une chaine qui contient des guillemets
    Par karimspace dans le forum Access
    R�ponses: 7
    Dernier message: 13/02/2006, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo