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

Langage C++ Discussion :

Conversion d'un String en Char*


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Conversion d'un String en Char*
    Bonjour à toutes et à tous,

    Je cherche à convertir un String en char* avec la méthode suivante, ça compile, mais apparemment, cela ne fonctionne pas. Quel peut être le problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char* strToChar(String s) {
      char buf[32];
      int n = s.length();
      for (int i = 0; i < n; i++)
        buf[i] = s[i];
      s[n] = '\0';
      return buf;
    }
    NOTA : développant pour un système Alduino, je n'ai pas accès à la méthode : string.c_str()

    Merci de votre aide.

    Pierre

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    buf est créée dans la fonction sur la pile et est donc supprimée à la fin de la fonction. Le pointeur (char *) retourné pointe donc sur un espace mémoire invalide. L'accès à cette adresse provoque un comportement indéterminé (le plus souvent une erreur de segmentation).

    Comme tu n'a pas accès aux méthodes c_str ou data (il devrait y avoir un équivalent...), tu peux :
    - passer ton tableau buf en paramètres de la fonction
    - faire une allocation dynamique dans la fonction
    - écrire ta propre classe string et jetter celle que tu utilises qui à l'air toute pourrie (ce que je recommande le plus)

    Actuellement ta fonction est buggée :
    - que ce passe-t-il si la taille de la chaîne de caractère est supérieure ou égale à 32 ?

    Un petit lien utile autour de l'allocation dynamique : FAQ C++ - Gestion dynamique de la mémoire

    Edit : Si tu as les méthodes begin et end, tu peux recopier ton string en vector<char> avec le constructeur et récupérer un char * const depuis le vector (attention à \0).

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Tu veux dire Arduino? Convertir une String Arduino en tableau de char?

    Je n'ai jamais essayé cette plate-forme, mais en voyant la méthode toCharArray(), j'essaierais ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* strToChar(String s) {
    	unsigned int bufSize = s.length() + 1; //String length + null terminator
    	char* ret = new char[bufSize];
    	s.toCharArray(ret, bufSize);
    	return ret;
    }
    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.

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Je vous remercie pour ces réponses. Pour autant, je me pose des questions.

    La méthode proposée par Medinoc fonctionne. Or, Ehonn a dit :
    Citation Envoyé par Ehonn Voir le message
    ... buf est créée dans la fonction sur la pile et est donc supprimée à la fin de la fonction. Le pointeur (char *) retourné pointe donc sur un espace mémoire invalide. L'accès à cette adresse provoque un comportement indéterminé (le plus souvent une erreur de segmentation). ...
    Cela veut donc dire que, dans ma méthode proposée par Medinoc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* ret = new char[bufSize];
    n'est pas supprimé quand la fonction se termine.

    Alors, si j'appelle 10000 fois la fonction, autant de fois est créée la variable "ret". Ce qui risque, à la longue, de me saturer la mémoire ???

    Cordialement.

    Pierre

  5. #5
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    En passant : «Oui».
    Grosso modo, un new, un delete.

    Avec ce genre de fonction c'est la fonction qui fait le new, et l'utilisateur qui fait le delete :s
    C'est assez sale en C++. On préfère : «celui qui fait le new, fait le delete». Tu peux te renseigner sur le RAII.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Oui, une fois que tu n'as plus besoin du buffer, il faut le supprimer avec delete[].

    Un new, un delete, et un new[], un delete[].

    ..Sinon, il doit y avoir l'option de faire la même chose avec un std::vector<char> au lieu d'un tableau dynamique; le nettoyage sera automatique.

    Probablement un truc de ce genre (non-testé!)
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    vector<char> strToChar(String s) {
    	unsigned int bufSize = s.length() + 1; //String length + null terminator
    	vector<char> ret(bufSize);
    	s.toCharArray(&ret[0], bufSize);
    	return ret;
    }
    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 émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Oui, une fois que tu n'as plus besoin du buffer, il faut le supprimer avec delete[].

    Un new, un delete, et un new[], un delete[]. ..
    Oui, mais si j'ai fait cette remarque, c'est parce que je ne vois pas comment faire un delete sur la variable "ret" de l'extérieur de la fonction. Et si je le fais de l'intérieur, je retombe sur la remarque de Ehonn ??

    Cordialement.

    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion d'un string en char*?
    Par melleb dans le forum C#
    Réponses: 4
    Dernier message: 02/09/2008, 10h06
  2. conversion d'une string en char
    Par vulkanosaure dans le forum C++
    Réponses: 12
    Dernier message: 02/11/2007, 19h55
  3. Conversion de type string en char ?
    Par CoachMac dans le forum C
    Réponses: 18
    Dernier message: 08/08/2006, 10h20
  4. conversion d'un string en char *
    Par ferry.jules dans le forum C++Builder
    Réponses: 15
    Dernier message: 12/05/2006, 22h12
  5. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54

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