begin process at 2012 02 11 16:41:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

string.h, c_str() & char*


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

string.h, c_str() & char*

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ée dans : string, printf, str, char, pouet


Répondre à ce message

Sujets en rapport avec ce message

conversion string et char, probleme [ par flowneo ] Bonjour, soit le code suivant, qui convertit une chaine string en char: #include #include #include using namespace std; int main (){ string com problème probablement lié aux références [ par fanfanfx ] Bonjour, je galère depuis quelques jours sur un bout de code. Pour être bref voici le code qui marche ne marche pas: [code=cpp]void maFonction(const Convertir unsigned char en string^ [ par elise42 ] Bonjour à tous, je code en C++ et je cherche à convertir un unsigned char Buffer_Envoi en un string ^Trame. Quelqu'un aurait il une idée? Merci d'a Etendre std::string(char *) pour utiliser nos references de char[] a l'interne [ par ebeaumier ] Bonjour,Je dois appeler une API externe qui ne prend que des "const string &" et nous utilisons a l'interne des char[].Est-il possible d'étendre la cl Pointeurs [ par rourou2030 ] Salut à tous,j'ai des lacunes concernants les pointeurs.En fait voici mon problème:Soitunsigned char *dataunsigned char *bufferest ce que l'appelle   String et char [ par lektrosonic ] Bonjour,Peut on extraire un char souhaite d'un string ?Mercil3KTr0 Was HeRe Serialiser une std::map (sans utiliser Boost) [ par tom24 ] Bonjour,voila pour un projet, je dois sérialiser en binaire des objets. Mes objets comprennent des string, mais aussi une map, et je ne sais pas vraim La class string [ par jderf ] Je suis débutant et je teste la class string. Voici un code tous simple, mais y'a un probleme de conversion à la compil que je ne comprend pas. Les er fread & fwrite [ par mosted ] Bonjour, Etant débutant , j'ai un soucis avec un code à faire pour l'école. Nous devons lire des structures d'un fichier binaire. Voici mon code [c


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,390 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales