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 :
Télécharger Witch VoirN'avez vous jamais voulu vous déplacer en va-et-vient entre deux fenêtres qui n'appartiennent pas toujours à la même application ? Si c'est le cas, Witch est faite pour vous ! Il est vrai que sur Mac vous pouvez utiliser "Exposé", mais si vous êtes...
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...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Langage C - Les chaînes de caractères 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 chaîne...

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
Collection CommentÇaMarche.net