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
    Débutant
    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
    Points : 332
    Points
    332
    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
    Points : 3 570
    Points
    3 570
    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" !?)
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    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
    Débutant
    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
    Points : 332
    Points
    332
    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 chevronné

    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
    Points : 1 878
    Points
    1 878
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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
    Débutant
    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
    Points : 332
    Points
    332
    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: 24/06/2010, 00h52
  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, 13h45
  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, 17h50
  4. [RSA]Encryption qui donne des fichiers vides
    Par Janitrix dans le forum Sécurité
    Réponses: 5
    Dernier message: 27/05/2007, 02h36
  5. insertin d'une chaine qui contient des guillemets
    Par karimspace dans le forum Access
    Réponses: 7
    Dernier message: 13/02/2006, 12h55

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