Const char * vers char * [Résolu]

Messages postés
21
Date d'inscription
jeudi 19 avril 2007
Dernière intervention
29 juin 2008
- - Dernière réponse : vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 14 mai 2008 à 18:38
Salut,

Je doit transformer un constchar * en char *. J'ai trouver sur internet: const_cast<char *>, mais je ne réussit pas à obtenir la variable sans le const

Je veux quelque chose du genre

<hr />ostringstream o;
//Assignation de valeur à o ici
//...
//
char * temp = const_cast<char *>(o.str().c_st());
<hr />
Merci à tous!
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
16
3
Merci
strTemp est locale, donc quand tu sors de ton for, la valeur retournée par c_str() n'est plus valide (la mémoire a été vraisemblablement libérée dans le destructeur de la chaine).
De toutes facons, quand tu commences à caster un const char* en char* c'est que tu joues avec le feu et tu va vers les ennuis. Ici il faut à un moment donnée allouer de la mémoire dans laquelle tu mettras tes chaines. Le plus simple dans ton cas c'est d'utiliser un vector<string> et non un vector<char*>

_____________________________________
Un éditeur de ressources gratuit pour Windows

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 87 internautes nous ont dit merci ce mois-ci

Commenter la réponse de vecchio56
Messages postés
21
Date d'inscription
jeudi 19 avril 2007
Dernière intervention
29 juin 2008
3
Merci
je doit obligatoirement pouvoir obtenir un  char *.

le problème de la boucle est que la classe vector a besoin de fonctions dans le template utilisé pour bien fonctionner. Char * n'a pas ces fonctions. Résultat: Un bug.

Donc, pour résoudre mon problème je fait un vector<string>
et j'obtiens un char * en fesant    char * temp = (char *)controllersName[compteur].c_str();

Et ça marche!!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 87 internautes nous ont dit merci ce mois-ci

Commenter la réponse de nord666
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
10
0
Merci
Dans ton cas:
char * temp = (char*)(o.str().c_str());

C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
21
Date d'inscription
jeudi 19 avril 2007
Dernière intervention
29 juin 2008
0
Merci
Enregistre "".

J'ai essayé avec une variable temporaire:

string strTemp = o.str();
char * temp =
(char *)strTemp.c_str());

Et ça marche.

Mais j'ai un autre problème!

J'utilise la library vector

for
(
int i = 0; i < num_joysticks; ++i)
{
ostringstream o;
o <<
"Joystick #" << i;
string strTemp = o.str();
controllersName.push_back((
char *)strTemp.c_str());
}

Je met un breakpoint à la ligne du   push_back.
Je fais F10 pour aller une ligne plus loin.
Je regarde le contenu de controllersName.
Il y a "Joystick #0". C'est normal.
Là je fais F10 à nouveau, il va sur la ligne  for(int i...  et le contenu de controllersName qui était "Joystick #0" est devenu "".
controllersName est déclaré comme suit juste après ma liste d'include

vector<

char *> controllersName;

Une idée de solution?
Commenter la réponse de nord666
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
16
0
Merci
Tu devrais quand même te demander pourquoi tu as besoin d'un char* et non d'un const char*. Si tu as besoin d'un char*, ca veut dire que la chaine peut être modifiée. Or la valeur retournée par c_str() ne doit pas être modifiée.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.