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 :

[C++] string -> const char*


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut [C++] string -> const char*
    Bonsoir,

    j'aimerais cr�er en C++ (donc avec les new) un tableau 4D
    La premi�re dimension serait de type int tandis que les 3 autres dimension seraient de type char*


    Pour 1 num�ro je voudrais 3 char*

    exemple :

    [int numero1] [int numero2] [int numero3]
    [char* champ1.1] [char* champ2.1] [char* champ3.1]
    [char* champ1.2] [char* champ2.2] [char* champ3.2]
    [char*champ1.3] [char*champ2.3] [char*champ3.3]

    ca fait un bon moment que je suis dessus et je ne vois toujours pas comment faire :S


    Merci bien pour votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par d�faut
    OK si je comprends bien, en fait tu veut faire un tableau � une dimension dont chaque �l�ment est un triplet de char*

    Donc (toujours si je comprend bien la question) il faudrait (possibilit�, il y en a d'autre) d�finir une classe groupant 3 char* :
    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
     
    class triplet
    {
    public:
        triplet(const char* c1 = 0,
                  const char* c2 = 0,
                  const char* c2 = 0)
        :    champ1(c1),
             champ2(c2),
             champ3(c3){}
     
        const char* champ1;
        const char* champ2;
        const char* champ3;
    }
    Ensuite plusieurs cas :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Voici une table de taille fixe et prévu à la compilation
    triplet table[constante];
    // Accès au champ 1 de l'élement premier :
    table[0].champ1;
     
    // Autre méthode, pointeurs, fixé après coup.
    triplet table2 = new triplet[variable];
    //...
    delete[] table2;
     
    // Maintenant une table de taille variable
    std::vector<triplet> table3;
    table3.push_back(triplet("Salut", "Tout", "Le monde"));
    J'esp�re ne pas �tre � cot� de la question
    ++

  3. #3
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Rien compris.
    Je n'ai pas l'impression que l'on ait les m�mes d�finitions pour "tableau" et pour "dimension de tableau".

    Tu t'en servirais comment de ton truc ?


    EDIT: Si Syrmonsieur a bien compris ce que tu voulais faire, son code causera des gros ennuis relativement � la gestion de la m�moire. L�, �a passe car il n'utilise que des chaines constantes litt�rales dans son exemple.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    il suffit de faire un tableau de tuple<int, std::string, std::string, std::string>

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par d�faut
    EDIT: Si Syrmonsieur a bien compris ce que tu voulais faire, son code causera des gros ennuis relativement � la gestion de la m�moire. L�, �a passe car il n'utilise que des chaines constantes litt�rales dans son exemple.
    En effet, pour �viter les probl�mes, il vaudra mieux utiliser des std::string.
    Enfin, �a d�pends de ce que tu veux faire...�a repr�sente quoi au juste ? (�a m'aurait aider pour bien comprendre ta question, l� je suis peut etre � cot�...)


    ++

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    On ne peut pas utiliser autre chose qu'un type entier comme indice de tableau "tableau".
    Si tu veux indicer un tableau avec une cha�ne, il te faut un tableau associatif.


    Ou bien, tu as mal dit ce que tu voulais et tu cherches plut�t un ensemble (genre std::set) de tuples (entier, chaine, chaine, chaine)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    Citation Envoy� par M�dinoc
    Ou bien, tu as mal dit ce que tu voulais et tu cherches plut�t un ensemble (genre std::set) de tuples (entier, chaine, chaine, chaine)
    Merci pour vos r�ponses.
    Alors en fait mon esprit �tait un peu confu et je voulais r�aliser ce que tu d�cris M�dinoc.

    Mais en lisant les r�ponses il me suffit de cr�er un tableau de triplet
    Je ne vois pas en quoi un tableau de triplet peu poser un pb de m�moire.
    ma classe triplet comportera 3 string et le tour est jou�

    Merci bien pour votre aide

  8. #8
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Le probl�me viendra avec la manipulation de char* qu'il faudra syst�matiquement allouer, copier et d�sallouer sans se prendre les pieds dans les exceptions.
    En C++, on pr�f�re utiliser des types d�di�s comme std::string.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    ok merci
    mais bon je ne pense pas pouvoir changer partour car j'utilise des classes prenant comme parametre des char *

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Si tu as des fonctiosn bien faites qui prennent en param�tre des const char *, tu peux utiliser tes std::string.

    Mais si tu as des fonctions soit mal faites, soit qui ont r�ellement besoin d'un buffer, tu devras rester en char * (ou utiliser ta propre classe), car il n'y a aucun �quivalent � ATL::CSimpleStringT::GetBuffer() dans les std::string...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    bon j'h�site � ouvrir un nouveau topic mais comme le sujet devie pourquoi ne pas approfondir la conversion string -> const char *

    et voila :O





    D'autre part ma fonction a comme parametre un const char* mais si je met le string sans conversion j'obtient ce message d'erreur

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    cannot convert parameter 2 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> 
    >' to 'const char *'

  12. #12
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Il nous faut plus de code, l�...
    Et v�rifie que l'appel � length() ne modifie pas les entrailles de la cha�ne (m�me si en th�orie, �a ne devrait rien changer)...

    De plus, il est connu que l'impl�mentation de la STL livr�e avec Visual 6 est bugg�e.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    ba j'ai une chaine de caract�res de la base �tendue ASCII
    j'en ai 49 :

    la voici en binaire

    00111000 00001000 01111010 00001010 00000101 01010100
    00011111 10010011 01111110 00011000 00111000 11011000
    00101100 01011010 11100101 00000000 11011001 11100100
    00001001 10001110 00101111 00001001 10110001 00010110
    00100001 01110001 01011111 00001001 01000011 11110111
    00000010 10110001 10101000 00000011 10111001 00001110
    00111111 11110100 11101110 00000000 00011101 10000000
    00001010 10110100 01111000 00011000 11001100 11000110
    00100100


    et lors de la conversion en char* il ne me reste que les 15 premiers caract�res, le reste a ... disparu ?

  14. #14
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    00111000 00001000 01111010 00001010 00000101 01010100
    00011111 10010011 01111110 00011000 00111000 11011000
    00101100 01011010 11100101 00000000 11011001 11100100
    00001001 10001110 00101111 00001001 10110001 00010110
    00100001 01110001 01011111 00001001 01000011 11110111
    00000010 10110001 10101000 00000011 10111001 00001110
    00111111 11110100 11101110 00000000 00011101 10000000
    00001010 10110100 01111000 00011000 11001100 11000110
    00100100
    Ce n'est pas une vraie cha�ne de caract�res, c'est un buffer d'octets.

    Donc si tu veux stocker des buffers d'octets, tu peux garder les char* (ou plut�t, char*+size_t pour la longueur), car std::string n'est pas appropri� ici.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    std::string n'est pas plus inappropri� qu'autre chose, ce ne sont que les op�rations qui interp�tent une cha�ne C termin�e par \0 qui poseront probl�me.

    Si on utilise des it�rateurs � la place de const char* par exemple, il n'y a aucun probl�me.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const char Buffer = [... plein de '\0' dedans ...];
     
    // Initialisation qui ne s'arrête pas au premier \0
    std::string StrBuffer(Buffer, Buffer + sizeof(Buffer));
     
    // Extraction qui va bien jusqu'à la fin
    char Buffer[... assez grand ...];
    std::copy(StrBuffer.begin(), StrBuffer.end(), Buffer);
     
    // Pour ne pas faire de copie, on peut aussi utiliser string::data() + string::length()
    Apr�s, en interne, il n'y a pas non plus de probl�me puisque c'est la taille stock�e qui est utilis�e pour d�limiter la fin de la cha�ne, et non un potentiel z�ro terminal.

    Bon, � part �a si le buffer n'a vraiment rien � voir avec une cha�ne de caract�res, effectivement on peut aussi utiliser std::vector<char> ou autre (mais pas char* !).

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    Citation Envoy� par M�dinoc
    Ce n'est pas une vraie cha�ne de caract�res, c'est un buffer d'octets.
    Je pense que je me suis mal exprim�, ma chaine ne contient pas des octects, j'avais donn� la version binaire de la chaine car la pluparts des caract�res ne sont pas visibles.
    C'etait bien pour montrer la longueur.

    Cependant tu as fait remarqu� 00000000.
    c'est �quivalent � '\0' et ca serait pour cela que ma chaine se tronque.
    Je n'avais vraiment pas fait attention.

    Cependant les m�thodes des classes que j'importe utilisent des const char * donc si j'utilise des std::vector<char> ca ne va pas aller.

    Il faudrait donc utiliser la solution des buffers que donne Laurent Gomila, cependant il faut avouer que je ne comprend pas tres bien ton code, donc je vais �tudier ca voir si j'arrive a mettre ca en place.

    En tout cas merci pour m'avoir montrer "00000000"



    EDIT: voila ce que je test mais ca me met le m�me prob�me

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    //string ClefUtilisateurCryptee -> clef avec plein de caractères non imprimable
    char * ClefUtilisateurCharCryptee = new char[ClefUtilisateurCryptee.length()];
    copy(ClefUtilisateurCryptee.begin(), ClefUtilisateurCryptee.end(),ClefUtilisateurCharCryptee);

  17. #17
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Comment as-tu initialis� ta cha�ne avant �a ?

    Cependant les m�thodes des classes que j'importe utilisent des const char * donc si j'utilise des std::vector<char> ca ne va pas aller.

    Il faudrait donc utiliser la solution des buffers que donne Laurent Gomila, cependant il faut avouer que je ne comprend pas tres bien ton code, donc je vais �tudier ca voir si j'arrive a mettre ca en place.
    http://c.developpez.com/faq/cpp/?pag...teneurs_avec_c

  18. #18
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    tu peux tr�s bien obtenir un char* � partir d'un std::vector<char>....
    Il suffit de prendre l'adresse du premier �l�ment.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    Citation Envoy� par Laurent Gomila
    Comment as-tu initialis� ta cha�ne avant �a ?
    C'est � dire ? comment dois-je l'initialiser ?


    Apr�s, en interne, il n'y a pas non plus de probl�me puisque c'est la taille stock�e qui est utilis�e pour d�limiter la fin de la cha�ne, et non un potentiel z�ro terminal.
    La taille tu la mets ou ? c'est ton [...assez grand...] ?

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 57
    Par d�faut
    et si je crypte ma chaine crypt�e en base64 ma nouvelle chaine sera contenue dans la table ASCII classique et donc plus ce probl�me ...

    en base64 c'est bien possible de crypter une chaine de caracat�re de l'ASCII �tendue ?

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. conversion const std::string et const char * ?
    Par panthere noire dans le forum C++
    R�ponses: 7
    Dernier message: 28/02/2011, 15h51
  2. std::string ou const char*
    Par amineabm dans le forum D�buter
    R�ponses: 14
    Dernier message: 01/02/2011, 10h12
  3. R�ponses: 4
    Dernier message: 28/01/2010, 11h28
  4. Convertir String^ en const char*
    Par Sixdeux dans le forum C++/CLI
    R�ponses: 3
    Dernier message: 22/05/2007, 09h58
  5. R�ponses: 3
    Dernier message: 25/10/2006, 22h54

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