Pouvez-vous me dire comment faire, svp ?
Version imprimable
Pouvez-vous me dire comment faire, svp ?
Convertir un TStrings en char* c'est �a ? Peut �tre la m�thode GetText ?
j'aimerais convertir le texte d'un m�mo en char*
Utilise la m�thode c_str de la classe String
SteveCode:
1
2 char* cp = Memo1->Text.c_str()
Ho le CON (je parle de moi)
Bonjour,
Attention !!!!Citation:
Envoy� par Superstivix
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 ?? 8OCitation:
Envoy� par Greybird
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
Citation:
Envoy� par L'aide de C++ Builder
Autant pour moi, lors de mon utilisation premi�re de c_str() j'avais du mal lire :hola:
Toutefois, dans mon programme je n'ai aucun probl�me :?
Salut !
Ca d�pend peut-�tre des versions BCB...Moi j'ai BCB3 Pro:
Si la dur�e de vie du tableau est limit� � l'appel .c_str() dans ce cas,Citation:
Renvoie un pointeur sur un tableau de caract�res � z�ro terminal contenant
les m�mes caract�res que l'AnsiString.
tu ne peux jamais rien copier puisqu'il se d�truirait juste apr�s !
A plus !Code:
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 ???? } //---------------------------------------------------------------------------
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
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) :
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.Code:
1
2
3
4
5
6 private: // assert(offsetof(AnsiString, Data) == 0); char *Data; // [...] char* __fastcall c_str() const { return (Data)? Data: "";}
en gros
marchera tout le temps puisque l_string n'a pas �t� d�truiteCode:
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; }
en revanche
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 fonctionCode:
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; }