Rechercher : dans
Par :

C++ : caster un string en const char *

Dernière réponse le 28 mai 2004 à 07:13:53 Tino, le 27 mai 2004 à 14:57:40 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « C++ : caster un string en const char * » dans :
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Langage C - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

marvinrouge, le 27 mai 2004 à 15:11:17

Salut ,

qu'appelles tu 'string'
- string de la STL ?
- String de MFC ?
- classe perso ?

Répondre à marvinrouge

2

Tino, le 27 mai 2004 à 15:15:19

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 ++

Répondre à Tino

3

marvinrouge, le 27 mai 2004 à 15:37:51

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 ???

Répondre à marvinrouge

4

Tino, le 27 mai 2004 à 15:48:30

#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;
}

Répondre à Tino

5

marvinrouge, le 27 mai 2004 à 15:53:02

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) ;

Répondre à marvinrouge

6

Tino, le 27 mai 2004 à 15:57:49

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 ?

Répondre à Tino

8

marvinrouge, le 27 mai 2004 à 16:03:44

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

Répondre à marvinrouge

7

rucht, le 27 mai 2004 à 16:00:31

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 ;-)

Répondre à rucht

9

Tino, le 27 mai 2004 à 16:12:24

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.

Répondre à Tino

10

marvinrouge, le 27 mai 2004 à 16:48:32

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.

Répondre à marvinrouge

11

 Tino, le 28 mai 2004 à 07:13:53

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.

Répondre à Tino