IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

conversion const std::string et const char * ?


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut conversion const std::string et const char * ?
    Hello

    j' essaye de me faire une fonction qui permet dans le main de mettre du std::string qui est le plus courant en c++ .

    je reprend du code C qui lui travaille en char

    donc je me disai que de passer une conversion const std::string var en const char * var devrai passer avec l'ajout de .c_str() qui permet de convertir en char , seulment il manque le pointeur.
    donc je fait comment ?

    voila un bout de code (non compilable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    using namespace std;
     
     
    void MD5File(const char*, char* md5);
     
    int main()
    {
    	const std::string sources; 
    	std::string md ;
    	sources="/home/user/nohup.out";
    	MD5File(sources.c_str(),md.c_str());
    	std::cout << "MD5" << md << std::endl;
    return 0;
    }
    void MD5File(const char* filename, char* md5)
    {
        cFileMD5 filemd5;
        filemd5.md5File(filename, md5);
        //return md5;
    }
    l'erreur est claire : main.cpp:: error: invalid conversion from ‘const char*’ to ‘char*’

    simple a première vue mai je vois pas comment faire la conversion ?? j'ai rien vu dans la faq qui concerne la conversion avec une const char *

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    la fonction c_str() de la class String te renvoie un pointeur sur un const char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* c_str ( ) const;
    Ton problème est que ta fonction MD5File veut un char * en deuxième argument (ce qui sous-entend qu tu peux modifier ce pointeur) or tu lui passes un const char * qui lui ne peut en aucun être modifé. Le compilateur ne pouvant assurer que le pointeur const que tu lui passes ne sera pas modifé il sort en erreur.
    Utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reinterpret_cast<char *>
    ou mieux un
    sur ton deuxième argument.

  3. #3
    screetch
    Invité(e)
    Par défaut
    ce code ne marchera pas, tu ne sais pas vraiment ce sur quoi pointe md.c_str()
    en particulier, tu ne sais pas si il a assez d'espace pour stocker le MD5 et d'ailleurs, en l'occurrence c'est non.
    De plus, si le pointeur renvoyé par c_str() pointe sur des données constantes, il y a bien une raison. Utiliser un reinterpret_cast ou un const_cast pourrait tout simplement mettre en l'air la chaîne de caracteres, un const_cast ou reinterpret_cast est souvent deconseillé (surtout le const_cast qui a pratiquement aucun cas d'utilisation valable)

    Bref, a la place de ca, utilise un tableau temporaire de caracteres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void MD5File(const char*, char* md5);
     
    int main()
    {
    	const std::string sources="/home/user/nohup.out";
            char md[33]; // un MD5 est sur 32 char? ou 16? chais plus
    	MD5File(sources.c_str(),md.c_str());
    	std::cout << "MD5" << md << std::endl;
    return 0;
    }
    void MD5File(const char* filename, char* md5)
    {
        cFileMD5 filemd5;
        filemd5.md5File(filename, md5);
        //return md5;
    }
    Dernière modification par screetch ; 28/02/2011 à 16h55. Motif: pinaise, la grosse faute

  4. #4
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par screetch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            char md[33]; // un MD5 est sur 32 char? ou 16? chais plus
    	MD5File(sources.c_str(),md.c_str());
    Ben vu que la fonction c_str() appartient à la classe string, elle ne risque pas non plus de beaucoup fonctionner sur un char.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par andnicam Voir le message
    Ben vu que la fonction c_str() appartient à la classe string, elle ne risque pas non plus de beaucoup fonctionner sur un char
    Vrai mais c'est juste une faute d'inattention équivalente à une faute de frappe, et au moins c'est détecté à la compilation. Alors que la mauvaise manipulation des cast peux provoquer des problèmes bien plus vicieux.
    Find me on github

  6. #6
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    La meilleure solution reste pour moi celle proposée par screetch (un MD5 est bien sur 32 caractères). Celle-ci a l'avantage de ne pas avoir à réecrire la fonction MD5File (si jamais tu n'y as pas accès).
    @andnicam : La fonction MD5File modifie certainement le second paramètre pour y stocker le MD5 du fichier dont l'adresse est passée en paramètre. Et je ne comprends de ce fait pas l'intérêt de la duplication de "ma jolie phrase".
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Merci pour vos réponse


    bon alors oui je récupère le md5 dans la variable md a 32 caractère .

    j'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	const std::string sources="/home/user/nohup.out";
    	char md[33]; 
    	MD5File(sources.c_str(),md);
    	std::cout << " MD5 : " << md << std::endl;
    si je comprend bien il faut éviter un cast. je vais dédier une fonction histoire de voir ce que sa donne.

Discussions similaires

  1. std::string ou const char*
    Par amineabm dans le forum Débuter
    Réponses: 14
    Dernier message: 01/02/2011, 10h12
  2. std::string en const WCHAR*
    Par caradhras dans le forum Langage
    Réponses: 5
    Dernier message: 26/06/2009, 16h21
  3. Réponses: 3
    Dernier message: 04/12/2006, 13h01
  4. Conversion de std::string en LPCWSTR
    Par Rodrigue dans le forum SL & STL
    Réponses: 11
    Dernier message: 16/05/2006, 15h33
  5. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo