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)

jeudi 5 janvier 2006 à 22:17:15 | string.h, c_str() & char*

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.

jeudi 5 janvier 2006 à 23:02:37 | Re : string.h, c_str() & char*

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+

jeudi 5 janvier 2006 à 23:05:08 | Re : string.h, c_str() & char*

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 +

vendredi 6 janvier 2006 à 09:46:27 | Re : string.h, c_str() & char*

Joky

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

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


vendredi 6 janvier 2006 à 22:46:54 | Re : string.h, c_str() & char*

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



Cette discussion est classé dans : string, printf, str, char, pouet


Répondre à ce message

Sujets en rapport avec ce message

Debutant : ecrire et lire un fichier txt [ par manu ] Bonjour a tous.Je debute, aussi desole.... :)Je cherche donc a ecrire dans un fichier txt, puis a lire ce fichier ligne a ligne, faire un split / expl AnsiString et Char [ par JCLK ] J'ai un leger probleme :je recupere une String et j'ai ensuite besoin de la transformer en char *Est-ce possible ?La String contient un path ("C:\...\ Comment concertir Ansistring en unsigned char*????? [ par asik38 ] Ansistring x;unsigned char str[100];str[100]=x;??????Merci!!! tableau de char -> string [ par alfred289 ] bonjour,j'utilise BOrland C++ builder 5 et j'essaie de transformer un tableau de caractères en sring et je trouve pas commentmerci de votre aide Probleme typedef struct [ par shenron ] #include #include #include /*Definition de la structure*/typedef struct{ char login[11]; char mdp[11];}strlogin;/*Declaration de fonctions*/void ajo operator [] ds une classe string pr retourner un caractère [ par ngryman ] Salut à ts,voilà j'ai un petit souci ds une classe String que j'ai fait. J'ai inclu un opérateur [] qui comme un char* retourne le char à la position Convertir une string en char* [ par dickymoe ] Existe-t-il une fonction qui permet de convertir une string en char* ?ou alors une fonction qui compare deux string sans respecté la casse ???Merci(en Convertion d'une string en char [ par redpooka ] Voici avec ce programme ca n'affiche juste le premier charactère comment faire pour qu'il affiche toute la chaine de caracètre ?Merci#include <iostre Probleme converssion [ par zzzzzz ] <img src=/imgs2 Probleme malloc [ par zzzzzz ] <img src=/imgs2


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 2,480 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.