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++ Discussion :

Problème avec la methode c_str()


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut Problème avec la methode c_str()
    Bonjour,

    comme c'est marqué dans le titre du topic, j'ai un problème avec la méthode c_str() de la classe std::string.
    Voici le contexte : je récupère des informations via un recv sur un socket, à chaque recv je met ce que j'ai reçu dans un char*, puis je rajoute cette chaîne à un std::string, jusqu'à que j'ai tout reçu.
    Quand je regarde la taille du contenu de mon std::string via la méthode length(), j'ai bien quelque chose de correcte, mais lorsque j'appelle c_str() pour vérifier le contenu, ça me retourne une chaine courte de 4 ou 5 caractères, toujours la même, qui serait je suppose une adresse.

    Merci d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    n'y aurait-il pas des caractères non imprimables dans ta chaîne ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Ce n'est pas ça le problème, le std::string contient bien la bonne chaine, je l'ai affiché et c'est nickel (y'a en moyenne plus de 35000 caractères dedans, voir bien plus), mais c_str() me renvoie une suite de quelques caractères (4 ou 5) et toujours les même. Je pensais à une adresse, mais c'est peu probable que ce soit exactement la même à chaque fois.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut
    tu peux nous montrer comment tu fais stp? Moi je ferais plutôt un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    size_t size = tonstring.size() + 1;
    char* chaine = new char[size];
    strncpy(chaine,tonstring.c_str(),size);

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    C'est bien beau grutt, mais dans ton exemple tu utilise la méthode c_str(), cette méthode même qui me pose problème.

    J'ai un char[1500] (1500 représentant la taille d'un packet), et lorsque je fais un recv, à chaque tour de boucle je rajoute dans mon std::string le contenu du char[1500], via la methode append() pour rajouter pile ce que j'ai reçu.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Effectivement, la fonction c_str() de la classe string renvoie... un pointeur sur le premier élément la chaine de caractères "C style" équivalente au contenu de la chaine

    Mais, ce que j'ai le plus de mal à comprendre, c'est dans quel but tu souhaites transformer cette chaine std::string en chaine "C style", alors qu'une bonne partie de ton travail a, justement, consisté à... créer une chaine std::string sur base de chaines "C styles" récupérées par ailleurs.

    Je ne veux certainement pas dire que tu ne dois pas le faire, mais je veux insister ici sur le fait que le seul cas "cohérent" dans lequel tu voudrais le faire est d'effectuer une analyse (sémantique ou syntaxique) de cette chaine ou de convertir la chaines en "autre chose" (ce qui revient quelque part à passer par une analyse de la chaine)...

    Et, dans ce cas, ce n'est, à mon sens, pas par une chaine "C style" qu'il et intéressant de passer, mais bien par... un flux de conversion stringstream (ou toute autre méthode de récupération de données sauvegardée)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Je fais ça pour une raison bien sûr. J'utilise le framework Qt4, le std::string contient en fait une image jpeg que je dois passer en argument à la méthode loadFromData de la classe QImage, cette méthode demande un uchar (autrement dit un unsigned char*).
    Par ailleurs je viens de tester quelque chose et je trouve cela assez surprenant, lorsque j'utilise c_str() pour écrire dans un fichier (en faisant fichier.write(buffer.c_str(), buffer.length()) ), le contenu y est bien inscrit.

Discussions similaires

  1. Problème avec la methode c_str() de std::string
    Par kzwix dans le forum Langage
    Réponses: 7
    Dernier message: 08/12/2010, 12h23
  2. Problème avec la method Get
    Par Mat67 dans le forum Langage
    Réponses: 10
    Dernier message: 25/06/2007, 12h13
  3. Réponses: 3
    Dernier message: 12/04/2007, 10h47
  4. Réponses: 2
    Dernier message: 24/10/2005, 10h23
  5. [IDHTTP] Problème avec la methode post (login:pass@ww.url)
    Par Rayek dans le forum Web & réseau
    Réponses: 5
    Dernier message: 11/07/2005, 10h03

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