begin process at 2008 07 06 15:52:47
1 205 627 membres
195 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : string.h, c_str() & char* [ Archives / Au secours ] (MyXiLo)

string.h, c_str() & char* le 05/01/2006 22:17:15

MyXiLo
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.

Re : string.h, c_str() & char* le 05/01/2006 23:02:37

cosmobob
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()

a+

Re : string.h, c_str() & char* le 05/01/2006 23:05:08

cosmobob
tiens d'ailleurs vas voir la: http://c.developpez.com/faq/bcb/?page=donneeschaines

on peut y lire:
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 :

AnsiString Src = "Source.txt";
AnsiString Dest = "Destination.txt";
char * pSrc = Src.c_str();
char * pDest = Dest.c_str();
// instructions
CopyFile(pSrc,pDest,true);


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;


a +

Re : string.h, c_str() & char* le 06/01/2006 09:46:27

Joky
Membre Club
C'est pour ça qu'il faut jamais retourner un pointeur :)
C'est caca

if(!Meilleur("Joky")) return ERREUR;<


Re : string.h, c_str() & char* le 06/01/2006 22:46:54

Kaid

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)

Kaid - kaid.fr.st


Classé sous : string, printf, str, char, pouet

Participer à cet échange

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS