C++ : caster un string en const char *

Fermé
Tino - 27 mai 2004 à 14:57
 Egyptian - 6 juin 2011 à 14:29
Bonjour à tous, programmeurs.
Je cherche le moyen LE PLUS RAPIDE de convertir un string en const char * en C++
Si quelqu'un a une idée...

7 réponses

Bon alors je me suis renseigné auprès de mon professeur et il m'a répondu qu'il y avait au moins deux solutions, à peu près aussi rapides. Ces deux solutions sont :

string Str = "toto";

const char *CstStr1 = Str.data ();
const char *CstStr2 = Str.c_str ();

Je n'ai pas encore eu le temps de tester mais si vous voulez vous pourrez le faire vous-même, en choisissant une de ses 2 lignes et en la mettant comme corps de la fonction StrToChar (voir source plus haut).
Merci à tous pour votre aide, à bientôt peut-être.
3
marvinrouge
27 mai 2004 à 15:53
Salut Tion,

c'est de string.h que j'ai besoin pour t'aider

car si par exemple on a la classe string suivante dans string.h

class string{
private:
char* s;
}


le cast le plus rapide sera

string s = "toto";

const char* s2 = (const char*) ((char*)&s) ;
2
bijad2010 Messages postés 40 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 2 décembre 2015
26 avril 2010 à 12:00
SLT,

static void initName()
{
if(nPkt_ >= PT_NTYPE+1)
return;
char **nameNew = new char*[PT_NTYPE+1];
for(unsigned int i = (unsigned int)PT_SMAC+1; i < nPkt_; i++)
{
nameNew[i] = name_[i];
}
if(!nPkt_)
delete [] name_;
name_ = nameNew;
nPkt_ = PT_NTYPE+1;


name_[PT_TCP]= "tcp";
name_[PT_UDP]= "udp";
name_[PT_CBR]= "cbr";
name_[PT_AUDIO]= "audio";
name_[PT_VIDEO]= "video";
name_[PT_ACK]= "ack";
name_[PT_START]= "start";
name_[PT_STOP]= "stop";
name_[PT_PRUNE]= "prune";
name_[PT_GRAFT]= "graft";
name_[PT_GRAFTACK]= "graftAck";
name_[PT_JOIN]= "join";
name_[PT_ASSERT]= "assert";
name_[PT_MESSAGE]= "message";
name_[PT_RTCP]= "rtcp";
name_[PT_RTP]= "rtp";
name_[PT_RTPROTO_DV]= "rtProtoDV";
name_[PT_CtrMcast_Encap]= "CtrMcast_Encap";
name_[PT_CtrMcast_Decap]= "CtrMcast_Decap";
name_[PT_SRM]= "SRM";

name_[PT_REQUEST]= "sa_req";
name_[PT_ACCEPT]= "sa_accept";
name_[PT_CONFIRM]= "sa_conf";
name_[PT_TEARDOWN]= "sa_teardown";
name_[PT_LIVE]= "live";
name_[PT_REJECT]= "sa_reject";

name_[PT_TELNET]= "telnet";
name_[PT_FTP]= "ftp";
name_[PT_PARETO]= "pareto";
name_[PT_EXP]= "exp";
name_[PT_INVAL]= "httpInval";
name_[PT_HTTP]= "http";
name_[PT_ENCAPSULATED]= "encap";
name_[PT_MFTP]= "mftp";
name_[PT_ARP]= "ARP";
name_[PT_MAC]= "MAC";
name_[PT_TORA]= "TORA";
name_[PT_DSR]= "DSR";
name_[PT_AODV]= "AODV";
name_[PT_IMEP]= "IMEP";

name_[PT_RAP_DATA] = "rap_data";
name_[PT_RAP_ACK] = "rap_ack";

name_[PT_TFRC]= "tcpFriend";
name_[PT_TFRC_ACK]= "tcpFriendCtl";
name_[PT_PING]="ping";

name_[PT_PBC] = "PBC";

/* For diffusion : Chalermek */
name_[PT_DIFF] = "diffusion";

// Link state routing updates
name_[PT_RTPROTO_LS] = "rtProtoLS";

// MPLS LDP packets
name_[PT_LDP] = "LDP";

// for GAF
name_[PT_GAF] = "gaf";

// RealAudio packets
name_[PT_REALAUDIO] = "ra";

//pushback
name_[PT_PUSHBACK] = "pushback";

#ifdef HAVE_STL
// for PGM
name_[PT_PGM] = "PGM";
#endif //STL

// LMS entries
name_[PT_LMS]="LMS";
name_[PT_LMS_SETUP]="LMS_SETUP";

name_[PT_SCTP]= "sctp";
name_[PT_SCTP_APP1] = "sctp_app1";

// smac
name_[PT_SMAC]="smac";

// HDLC
name_[PT_HDLC]="HDLC";

// XCP
name_[PT_XCP]="xcp";

// Bell Labs (PackMime OL)
name_[PT_BLTRACE]="BellLabsTrace";

name_[PT_NTYPE]= "undefined";
}
0
marvinrouge
27 mai 2004 à 15:11
Salut ,

qu'appelles tu 'string'
- string de la STL ?
- String de MFC ?
- classe perso ?
1
Dans mon prog g écrit :

#include <string> // ou string.h
...

string Str = "Salut";

et je voudrais le caster en const char *
si tu ne comprend toujours pas donne moi ton e-mail et je t'envoie le source.
Merci ++
1
marvinrouge
27 mai 2004 à 15:37
mon meail c'est marvinrouge@hotmail.com mais je le consulte quasi jamais.

postes le code ici ça peut intéresser/aider plusieurs personnes si on trouve la réponse.

as-tu le fichier string.h ???
0
Tino > marvinrouge
27 mai 2004 à 15:48
#include <iostream.h>
#include <stdlib.h>
#include <string>
#include <stdio.h> // fopen (), fflush ()
#include <conio.h> // getche ()
#include <ctype.h> // toupper ()
#include <time.h> // clock ()

namespace
{
int IndexCaracs;
char *TabCaracs;
string Nom;
bool Trouve = false;

const char *StrToChar (string Str)
{
char *Tab = (char *) malloc ((Str.length ()+1) * sizeof (char));
for (int i = 0; i < Str.length (); ++i) Tab [i] = Str [i];
Tab [Str.length ()] = '\0';

return Tab;
}

const char *Build (string Name, string Pass)
{
// unrar e -av- -c- -cu -p<mdp> -y <nom du rar>

string Command = "unrar e -av- -c- -cu -inul -p" + Pass + " -y " + Name;
return StrToChar (Command);
}

bool CheckYesNo (string Question)
{
char c;
for ( ; toupper (c) != 'O' && toupper (c) != 'N'; cout << '\n')
{
cout << Question << " [o/n] ? ";
c = getche ();
}
return (toupper (c) == 'O');
}

void SearchRec (string MdPInit, int NbRest)
{
if (Trouve) return;
if (!NbRest)
{
cout << "Test de : " << MdPInit << endl;
if (0 == system (Build (Nom, MdPInit)))
{
cout << " => OK ! " << endl;
Trouve = true;
}
return;
}
for (int i = 0; i < IndexCaracs; ++i)
SearchRec (MdPInit + TabCaracs [i], NbRest-1);
}

void Chrono (clock_t d, clock_t f)
{
int NbH, NbM, NbS;
NbS = (int) ((double) (f-d)/CLOCKS_PER_SEC);
NbH = (NbS - (NbS % 3600)) / 3600;
NbS -= NbH * 3600;
NbM = (NbS - (NbS % 60)) / 60;
NbS -= NbM * 60;

cout << "Crackage effectue en "
<< NbH << 'h' << NbM << 'm' << NbS << 's' << endl;
}

}

int main()
{
int NbCar, Temp;
char c;
string MotDePasse;
bool Majus, Minus, Number, Other;
FILE *fd;
clock_t Debut, Fin;

Majus = Minus = Number = Other = false;
NbCar = 0;

cout << " Extraction d'un fichier Winrar " << endl
<< " ------------------------------ " << endl << endl;

if (! (fd = fopen ("UnRAR.exe", "r")))
{
cerr << "/!\\ Pour que le programme fonctionne vous devez placer cet executable dans le" << endl
<< " repertoire de WinRAR" << endl << endl;
system ("PAUSE");
return -1;
}
fclose (fd);

cout << "Entrez le nom de votre archive (sans le \".rar\") : "; getline (cin, Nom); Nom += ".rar";
if (!(fd = fopen (StrToChar (Nom), "r")))
{
cerr << "/!\\ Pour que le programme fonctionne vous devez placer votre archive dans le" << endl
<< " repertoire de WinRAR" << endl << endl;
system ("PAUSE");
return -1;
}
fclose (fd);

while ((!Majus) && (!Minus) && (!Number) && (!Other))
{
Majus = CheckYesNo ("Tester les majuscules");
Minus = CheckYesNo ("Tester les minuscules");
Number = CheckYesNo ("Tester les chiffres");
Other = CheckYesNo ("Tester les autres caracteres imprimables");
if ((!Majus) && (!Minus) && (!Number) && (!Other))
cerr << "/!\\ Vous devez au moins examiner 1 type de caracteres" << endl;
}

while ((NbCar < 1) || (NbCar > 8))
{
cout << "Nombre max. de caracteres du mot de passe [<= 8] ? ";
NbCar = getche () - 48;
if ((NbCar < 1) || (NbCar > 8)) cerr << " /!\\ Nombre incorrect !" << endl;
}

cout << endl << endl;
fflush (stdin);

cout << "Archive : " << '"' << Nom << '"' << endl;
if (Majus) cout << "Tester les majuscules" << endl;
if (Minus) cout << "Tester les minuscules" << endl;
if (Number) cout << "Tester les chiffres" << endl;
if (Other) cout << "Tester les autres caracteres" << endl;
cout << "Mot de passe de " << NbCar << " caracteres maximum" << endl << endl;
system ("PAUSE");

// Début de la recherche du mot de passe...
IndexCaracs = 0; Temp = 0;
if (Majus) IndexCaracs += 26;
if (Minus) IndexCaracs += 26;
if (Number) IndexCaracs += 10;
if (Other) IndexCaracs += 27;

TabCaracs = (char *) malloc (IndexCaracs * sizeof (char));
if (Minus) for (int i = 0; i < 26; ++i) TabCaracs [Temp++] = char (97+i);
if (Majus) for (int i = 0; i < 26; ++i) TabCaracs [Temp++] = char (65+i);
if (Number) for (int i = 0; i < 10; ++i) TabCaracs [Temp++] = char (48+i);
if (Other)
for (int i = 33; i < 127; ++i)
{
if (i == 48) i = 58;
else if (i == 65) i = 91;
else if (i == 97) i = 123;
else if ((i == 34) || (i == 38) || (i == 45) || (i == 62) || (i == 94))
continue;
TabCaracs [Temp++] = char (i);
}

Debut = clock ();
for (int i = 1; i <= NbCar; ++i) SearchRec ("", i);
Fin = clock ();
cout << endl;
Chrono (Debut, Fin);

system ("PAUSE");
return 0;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Disons que la classe string.h n'a pas été développée par mes soins, c'est celle de base du langage C++
Comment fais-tu toi pour déclarer une chaîne de caractères ?
0
marvinrouge
27 mai 2004 à 16:03
ben qd je faisais du C++, j'utilisais une classe String que j'avais développé et qui avait un char* en donnée membre
0
perso je conné un peut la classe string ( l 'ami du programeur ) mais reussi a faire ce que tu veut !!!
sorry mais tu peut faire const string ( g pas trouver dans ton code ou tu veut faire sa si tu peut mettre que se que tu a besion de modifier ce serra plus facile pour les autre ;-)
0
Désolé d'avoir mis tout le code, je vais essayer de résumer :
En fait je suis en train de faire un prog censé casser les codes de WinRAR, en essayant tout simplement toutes les possibilités.
Donc je stocke la commande à exécuter dans une string de la classe standard string du langage C++ (à ne pas confondre avec le C...), puis je l'exécute avec un appel à la fonction system ().
Seulement celle-ci demande un const char * et non un char * tout simple (donc pas de string non plus).

J'aurais aimé savoir si c'était possible de faire un const_ cast sur ma chaine, et si oui de quelle manière l'écrire.

Le transtypage se fait au niveau de la fonction StrToChar, pour ceux qui veulent aller y jeter un coup d'oeil... (attention : ce que j'ai fait marche mais c'est 'artisanal', il me faudrait un moyen moins coûteux en temps CPU).

Voilà, j'espère avoir été clair.
Merci à tous de votre aide.
0
marvinrouge
27 mai 2004 à 16:48
t'as essayé ?

string s = "toto";

const char* s2 = (const char*) ((char*)&s) ;

SI (je dis bien SI) la classe string contient le buffer (char*) en 1ère donnée membre ma méthode marchera.
0
Bonjour,
J'ai essayé votre formule précédente et pourtant, je n'arrive pas a obtenir les informations que je recherche :s
0