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

Convertir un TStrings en char [FAQ]


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Convertir un TStrings en char
    Pouvez-vous me dire comment faire, svp ?
    Chaque jour, il y a 30 Morts sur les routes......roulons sur les trottoirs


    Athlon XP 3000+, A7N8X-E Deluxe, 512 Mb DDR, Radeon 9600 Pro 256 Mb, 160 Gb.

  2. #2
    Membre régulier
    Avatar de bebeours
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 103
    Points : 123
    Points
    123
    Par défaut
    Convertir un TStrings en char* c'est ça ? Peut être la méthode GetText ?

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    j'aimerais convertir le texte d'un mémo en char*
    Chaque jour, il y a 30 Morts sur les routes......roulons sur les trottoirs


    Athlon XP 3000+, A7N8X-E Deluxe, 512 Mb DDR, Radeon 9600 Pro 256 Mb, 160 Gb.

  4. #4
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut
    Utilise la méthode c_str de la classe String

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* cp = Memo1->Text.c_str()
    Steve
    Modérateur Taverne et C++Builder
    Règles du Club - Règles de la Taverne
    FAQ BCB - sources
    Et je mords

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ho le CON (je parle de moi)
    Chaque jour, il y a 30 Morts sur les routes......roulons sur les trottoirs


    Athlon XP 3000+, A7N8X-E Deluxe, 512 Mb DDR, Radeon 9600 Pro 256 Mb, 160 Gb.

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    Citation Envoyé par Superstivix
    Utilise la méthode c_str de la classe String

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* cp = Memo1->Text.c_str()
    Steve
    Attention !!!!

    Ce code est faux ! Il marche, mais le pointeur fourni par c_str() n'est valide qu'au moment de l'appel à c_str(). Autrement dit, dès la ligne suivante, le comportement est indéfini.

    Il faut utiliser un strcopy pour copier la chaine pointée par le c_str() dans une zone mémoire allouée pour l'occasion, et pointée par cp.

    Cordialement,

    Arnaud

  7. #7
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut
    Citation Envoyé par Greybird
    Bonjour,

    Citation Envoyé par Superstivix
    Utilise la méthode c_str de la classe String

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* cp = Memo1->Text.c_str()
    Steve
    Attention !!!!

    Ce code est faux ! Il marche, mais le pointeur fourni par c_str() n'est valide qu'au moment de l'appel à c_str(). Autrement dit, dès la ligne suivante, le comportement est indéfini.

    Il faut utiliser un strcopy pour copier la chaine pointée par le c_str() dans une zone mémoire allouée pour l'occasion, et pointée par cp.

    Cordialement,

    Arnaud
    Faux ??

    Chez moi ça marche très bien et de plus il est écrit tel quel dans l'aide de C++Builder5 sur c_str()

    Tu as peut-être raison Arnaud mais si on ne peut plus faire confiance au code qui est écrit dans l'aide de Builder ou vas t'on??

    Steve
    Modérateur Taverne et C++Builder
    Règles du Club - Règles de la Taverne
    FAQ BCB - sources
    Et je mords

  8. #8
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par L'aide de C++ Builder
    AnsiString::c_str() renvoie un pointeur temporaire non const sur le tampon de chaînes interne dans l'objet AnsiString. Le pointeur est invalide dès que l'exécution de l'instruction dans laquelle il est utilisé est terminée. Ainsi, ne faites pas comme suit :

    char* cp = Edit1->Text.c_str();
    char* cp2 = strtok( cp, " \t\n" ); // cp n'est plus valide


    Si vous avez besoin d'un pointeur persistant, vous devez copier la chaîne dans son propre tampon :

    char* cp = new char[ Edit1->Text.Length() + 1 ];
    strcpy( cp, Edit1->Text.c_str() );

  9. #9
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut
    Autant pour moi, lors de mon utilisation première de c_str() j'avais du mal lire

    Toutefois, dans mon programme je n'ai aucun problème
    Modérateur Taverne et C++Builder
    Règles du Club - Règles de la Taverne
    FAQ BCB - sources
    Et je mords

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Ca dépend peut-être des versions BCB...Moi j'ai BCB3 Pro:

    Renvoie un pointeur sur un tableau de caractères à zéro terminal contenant
    les mêmes caractères que l'AnsiString.
    Si la durée de vie du tableau est limité à l'appel .c_str() dans ce cas,
    tu ne peux jamais rien copier puisqu'il se détruirait juste après !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    AnsiString Nom = "LeMien";
    char Buffer[1024];
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    char *temp = Nom.c_str();
    //temp ne serait donc plus valable à partir d'ici !
    int le = strlen(temp); //devrait renvoyer une erreur puisque temp a été libéré
    CopyMemory(Buffer,temp, le + 1); //devrait générer une erreur ou copier n'importe quoi
    //Buffer contiendrait tout sauf mon nom !
    Panel1->Caption = temp; //ça fait plus de quelques µs que temp n'existe plus !
    //Ici ça devrait faire n'importe quoi !
    Panel1->Caption = Panel1->Caption + " " + IntToStr(le);
    //Et bien contrairement à ce qui a été dit
    //Panel1 montre bien "LeMien 6" !!!!
    Label1->Caption = temp;
    //et bien oui... temp est toujours valide !
    //Normalement BCB devrait libérer son propre tableau temp ici... non ????
    }
    //---------------------------------------------------------------------------
    A plus !

  11. #11
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    2 remarques :
    1 - Il n'est plus valide à l'instruction suivant celle dans laquelle il est inséré.
    2 - plus valide ne veut pas dire que le contenu a changé. Néanmoins, on n'est pas sûr du contenu...

    Cordialement,

    Arnaud

  12. #12
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    d'apres le code de c_str() dans la VCL, le pointeur est toujours valide dans les instructions suivant celle dans laquelle il est inséré.
    En revanche il ne serait plus valide à la sortie de la fonction dans laquelle l'Ansistring a été déclarée

    voici le code de l'ansistring (fichier dstring.h) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      private:
        // assert(offsetof(AnsiString, Data) == 0);
        char *Data;
        // [...]
        char* __fastcall c_str() const        { return (Data)? Data: "";}
    donc Data est un char *, donnée membre de l'AnsiString dont la durée de vie est exactement celle de l'ansistring qui la contient.



    en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void fonction()
    {
        AnsiString l_string = "tutu";
        char * l_ptr = l_string.c_str();
        cout << l_ptr << std::endl;
        Panel1->Caption = l_ptr;
        Label1->Caption = l_ptr; 
    }
    marchera tout le temps puisque l_string n'a pas été détruite

    en revanche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char * fonction()
    {
        AnsiString l_string = "tutu";
        char * l_ptr = l_string.c_str();
        return l_ptr;
    }
     
    void main()
    {
         char * l_temp = fonction();
         std::cout << l_temp << std::endl;
    }
    peut très bien marcher pendant une semaine et planter la semaine suivante ou sur un autre ordi, car l_string a été détruite et son espace mémoire a pu etre réalloué pour qqc d'autre apres la sortie de fonction

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

Discussions similaires

  1. [D7] Convertir un integer en char
    Par raoulmania dans le forum Langage
    Réponses: 11
    Dernier message: 17/08/2008, 11h30
  2. [convertir en date un char]
    Par agougeon dans le forum Sybase
    Réponses: 2
    Dernier message: 29/06/2006, 15h11
  3. [debutant] Comment convertir un string en char
    Par jbidou88 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 04/05/2006, 12h58
  4. Réponses: 1
    Dernier message: 13/10/2005, 15h10
  5. Réponses: 3
    Dernier message: 02/07/2003, 16h24

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