MyXiLo
Messages postés57Date d'inscriptionvendredi 21 mai 2004StatutMembreDernière intervention28 juillet 2006
-
5 janv. 2006 à 22:17
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 2006
-
6 janv. 2006 à 22:46
Bonjour,
Il y a un petit quelque chose que je ne comprends pas avec les std::string de string.h
std::string Pouet="LALALALa";
printf("%s", Pouet.c_str());
Va afficher LALALALa, de meme que printf("%s", (char *) Pouet.c_str());
Cependant, ce qui suit n'affiche rien:
char* Zou=(char *)Pouet.c_str();
printf("%s", Zou);
Le code fonctionne mais le printf n'affiche rien. Ce que je ne comprends evidement pas.
Si quelqu'un sait répondre a cette question relativement penible je me tiens a l'ecoute.
Thomas.
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 5 janv. 2006 à 23:02
salut,
le pointeur que te délivre .c_str() n'est assuré d'etre valide qu'au moment du retour de cette fonction. En gros, rien ne garantit que string maintienne un tableau de char terminé par un 0, dont tu te souviens du début en le mettant dans une variable. ton exemple montre que c'est pas le cas.
Si une fonction f renvoie un objet de class A, qui a un opérateur de conversion automatique vers les char*, alors char* t = f(); va compiler. mais ton objet A en retour de f va disparaitre a la ligne suivante et ton pointeur t ne sera plus valide.
ca doit, au vu de ton petit code, etre ce qui se passe pour std::string::c_str()
Attention ! La méthode c_str retourne un pointeur sur une
chaîne C, qui n'est valable que pour l'instruction suivant l'appel à
c_str. En d'autres termes, vous ne pouvez pas faire ceci :
En effet, au moment où CopyFile est exécutée, pSrc et pDest pointent sur un emplacement mémoire dont le contenu est indéfini .
Il se peut très bien que la mémoire ait été écrasée entre les
instructions c_str et l'appel à CopyFile. Ce ne sera pas toujours le
cas, et le programme peut très bien fonctionner parfaitement pendant
très longtemps, et planter de façon aléatoire...
Pour résoudre ce problème, il faut utiliser la fonction strcpy :
AnsiString Src = "Source.txt";
AnsiString Dest = "Destination.txt";
char * pSrc = new char[Src.Length()+1]; // +1 pour le 0 terminal
char * pDest = new char[Dest.Length()+1];
strcpy(pSrc,Src.c_str());
strcpy(pDest,Dest.c_str());
// instructions
CopyFile(pSrc,pDest,true);
delete[] pSrc;
delete[] pDest;
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 6 janv. 2006 à 22:46
1- On parle ici d'un objet string de la STL qui n'a rien à voir avec l'objet Borland AnsiString.
2- Tant que tu n'effectues aucune opération qui modifie l'objet string, le pointeur que tu as récupéré via la méthode c_str() est toujours valide.
3- Le type de retour de la méthode c_str() est const char* que tu castes en char*. Si ce pointeur est constant c'est qu'il y a une raison, faire un cast pour le "supprimer" indique une erreur dans la conception de ton code.
4- Ton problème ne vient t'il pas tout simplement d'un oubli de retour-charriot ? Essayes printf("%s\n", Zou)