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 :

prob string a convertir en tableau de char


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut prob string a convertir en tableau de char
    Bonjour,
    Pour gérer les chaines de caractères, notre professeur nous a appris cette méthode: typedef char nom [LGMAX]

    J'ai donc utilisé des tableaux de char pour tout mes sous programmes(il y en a bcp) mais pour la gestion des fichiers, on nous a appris avec string.

    Mon problème est que j'ai récupéré une chaine de caractère dans un string mais je voudrai la mettre dans un paramètre d'un sous programme.

    Comme tout mes paramètres effectif sont des tableau de char ca ne marche pas et je ne sais pas comment convertir mon string en t_tab_char tableau ce caractere.

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Regarde la méthode .c_str() d'un objet string ...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    oui j'ai essayé mais ca ne marche pas

    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 generer_mot_aleatoire(t_tab_chaine &mot_mystere)
    {
        int i;
        int nbre_aleatoire;
        string ligne ;
        ifstream fichier; 
        nbre_aleatoire = generer_nombre_aleatoire();
        fichier.open("liste_mot.txt"); // on ouvre le fichier en lecture
        if(fichier)  // si l'ouverture a réussi
        {
            for(i=0;i<nbre_aleatoire; i++)
            getline(fichier, ligne); 
            fichier.close();
        }
        else  // sinon
            cout << "Impossible d'ouvrir le fichier !" << endl;
        mot_mystere = ligne.c_str();  cet ligne ne marche pas
    De plus je ne sais pas manipuler les pointeurs

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Tout d'abord, qu'est-ce qu'un t_tab_chaine ? Un char* un char[] ? Une structure ?...
    Deuxièmement a tu vérifié le contenu de ligne avant l'affectation à mot_mystere ? (en faisant un cout<<ligne)
    Troisièmement, si t_tab_chaine est un char[] et non un char*, tu seras peut être obligé de passer par sprintf car ton tableau a une taille fixe.
    Dernièrement, je te propose d'utiliser les balises code.
    En espérant pouvoir t'aider.
    mais pour la gestion des fichiers, on nous a appris avec string.
    Le C gère aussi très bien les fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE*mon_fichier=fopen("fichier.txt","r");//Ouverture en lecture
    if(mon_fichier)
    {
    //Puis tu utilise fscanf pour lire ton fichier
    }
    fclose(fichier);
    J'ai donc utilisé des tableaux de char pour tout mes sous programmes(il y en a bcp)
    Normalement, pour gérer des chaines de caractères, on préfère pouvoir les redimensionner. C'est pourquoi on utilise soit un char*, soit un objet string(qui utilise un char*).

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci beacoup de ta réponse

    t_tab_chaine c'est typedef char t_tab_chaine[LGMAX];
    je crois que c'est une structure donc

    oui j'ai vérifié le contenu de ligne ça marche très bien

    Mon professeur ne veut pas que j'utilise le C pour les fichiers

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Donc après ces typedef (qui ont peu de sens ?) je croit avoir compris que tu as un char[]. Dans ce cas la, utilise sprintf http://www.cplusplus.com/reference/c...stdio/sprintf/ Tu dois avoir l'équivalent c++ quelque part mais je ne la connait pas. Personnellement j'ai jamais compris si un tableau était un pointeur ou pas : parfois il semble que oui, d'autres que non. C'est pourquoi j'utilise que des pointeurs. Mes bon, il doit bien y avoir des gens qui comprennent comment sa marche ...
    Avec sprintf (même si c'est un peu compliqué), c'est sur qu'il y a une solution.
    Bonne chance.

    Il doit y avoir une solution plus simple mes je ne la connais pas.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par lapinette Voir le message
    Pour gérer les chaines de caractères, notre professeur nous a appris cette méthode: typedef char nom [LGMAX]
    Soit tu n'es pas dans le bon forum (ça, ce serait plutôt du mauvais C) soit ton prof est fou.

    En C++, on utilise le type string de la STL. Manipuler des tableaux de char (de taille fixe qui plus est) est de l'autoflagellation, sauf dans certaines circonstances bien spéciales (longueur max connue à l'avance, désir d'éviter des allocations mémoire, etc).

    Je te conseille de virer tous ces tableaux de char et de lire la doc C++ (par exemple google C++ string)...

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Je crois que j'ai trouvé. Change "mot_mystere=ligne.c_str();" en strcpy(mot_mystere,ligne.c_str());
    Si sa marche je crois que je pourrais expliquer pourquoi. Mais test avant...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    strcpy(mot_mystere,ligne.c_str()); marche très bien merci

    parfeu peut être que mes profs ont choisi de limiter nos connaissance pour pas trop nous "embrouiller", je suis en génie électrique, donc pas pour devenir fort en c++, je leur poserai la question

    merci noidea

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Le C et le C++ ne sont pas exclusifs.
    Un string ou un AnsiString est une sorte de classe.
    Si on veut travaille avec un AnsiString, on fera
    AnsiString Chaine; // ni new ni dimension.
    Si on veut y mettre une valeur
    Chaine = AnsiString("Un texte");
    Si on veut rajouter quelque-chose
    Chaine += Ansistring(" avec un bout en plus");
    Chaine contient maintenant "Un texte avec un bout en plus".
    On peut faire différentes opérations sur cet AnsiString, recherche d'un bout de chaine par exemple.

    Un char* est un pointeur sur une chaine de caractères avec 0 terminal.
    Cette chaine de caractères occupe un certain espace mémoire égal au nombre de caractères plus 1.
    Si on écrit char T[32] on réserve dans la mémoire un espace de 32 octets où on pourra mettre 31 caractères (à cause du 0 terminal.
    Et dans tous les cas, T est un pointeur sur la chaine, ce qui fait que
    *T est identique à T[0] et renvoie le premier caractère de la chaine.
    Si on écrit T+=5; alors *T = T[0] = le 5è caractère de la chaine.

    La fonction c_str() renvoie un pointeur sur la chaine contenue dans le string ou AnsiString.
    Si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char *T;
    T=S.c_str();
    // on pourrait de dire que le tableau commençant par le pointeur sur 
    // T contient la chaine. La seule chose qu'on a oublier  est de réserver 
    // l'espace mémoire. Donc c'est faux.
    //Il faut faire
    char T[32];
    strcpy(T,S.c_str());
    Naturellement, il faut connaitre la longueur maximale de l'AnsiString (ou string) pour dimensionner le tableau T.
    On peut aussi dimensionner T de façon dynamique (malloc ou new.)

    Je suppose que les tableaux de chaine qui sont transmis (par pointeur j'espère) ont été dimensionnés correctement. Donc on pourra avoir
    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
    22
     
      Traitement(char *mot)
      {
        ...
      }
      Ansistring S;
      getline(fichier,S);
      char mot_mistere(bonne_dimension];
      strcpy (mot_mystere,S.c_str();
      Traitement(mot_mystere);
     
    //Mais on peut faire plus joli et surtout pour satisfaire le professeur
      Traitement(AnsiString S)
      {
        char chaine[bonne_dimension];
        strcpy(chaine,S.c_str());
        return Traitement(chaine); 
      }
    // l'appel sera alors
      Ansistring S;
      getline(fichier,S);
      Traitement(S);
    Ceci (sauf faute de frappe éventuelle) est tout à fait correct.
    Vous remarquerez que la fonction n'a pas changé de nom, cela s'appelle la surcharge.
    Voila
    Bon développement.

    PS Le C++ est certainement plus difficile à apprendre, puis qu'il suppose la connaissance de C, en tout cas à mon avis.

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par peufeu Voir le message
    Soit tu n'es pas dans le bon forum (ça, ce serait plutôt du mauvais C) soit ton prof est fou.
    Ou simplement peu compétent, ou alors avec une idée de la pédagogie bottom-up plutôt que top-down, ou alors...

    Mais je plussoie : Utiliser string simplifie la vie.

    Citation Envoyé par Pierre Dolez Voir le message
    La fonction c_str() renvoie un pointeur sur la chaine contenue dans le string ou AnsiString.
    Si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *T;
    T=S.c_str();
    // on pourrait de dire que le tableau commençant par le pointeur sur 
    // T contient la chaine. La seule chose qu'on a oublier  est de réserver 
    // l'espace mémoire. Donc c'est faux.
    Non, ce code n'est pas correct, mais pour une toute autre raison : c_str nous retourne un pointeur sur le premier des caractères du tableau de caractères contenu dans la chaîne. Ils ont été alloués par la chaîne S, et tant que S continue à exister, et que son contenu n'a pas été modifié, ce tableau existe en mémoire, donc on peut utiliser l'adresse sur son premier caractère sans problèmes.

    Alors, qu'est-ce qui cloche ? Tout simplement, on n'est pas sensé pouvoir modifier le contenu du ce tableau à l'aide du pointeur retourné par c_str (pour simplifier, on va dire qu'il serait techniquement possible de modifier des caractères ainsi, mais pas d'en ajouter, car on court-circuiterait la gestion de la mémoire faite par string. Donc on a préféré tout limiter). Donc, le type de retour de c_str est char const * : Un pointeur sur des caractères constants. Il n'est pas possible d'affecter directement un char const * à un char *, car se second pointeur aurait des accès non constants à la mémoire. D'où l'erreur.

    Citation Envoyé par Pierre Dolez Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Il faut faire
    char T[32];
    strcpy(T,S.c_str());
    Naturellement, il faut connaitre la longueur maximale de l'AnsiString (ou string) pour dimensionner le tableau T.
    On peut aussi dimensionner T de façon dynamique (malloc ou new.)
    En effet, ici, on ne veut pas récupérer simplement le tableau de caractère à l'intérieur de la chaîne, mais on veut remplir un autre tableau, dont l'emplacement en mémoire a déjà été décidé par l'appelant de la fonction, avec le contenu de la chaîne. Pour ça, strcpy peut marcher, mais pose le problème de la longueur maximale. Il existe une fonction toute faite pour copier une chaîne dans un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string S = "Ce qu'on veut, pas grave si ça dépasse 32 caractères";
    char T[32];
    S.copy(T, 32); // Copie les 32 premiers caractères uniquement, 
    // n'ajoute pas de 0 terminal, selon l'utilisation de T dans la suite du 
    // programme, il faudra peut-être en ajouter un manuellement. Dans du vrai 
    // code, on remplacerait 32 par une constante nommée, ou un calcul par le
    // compilateur de cette taille.
     
    // Version avec 0 terminal :
    size_t nbCar = S.copy(T, 31);
    T[nbCar] = 0;
    Citation Envoyé par Pierre Dolez Voir le message
    PS Le C++ est certainement plus difficile à apprendre,
    Jusque là d'accord. Plus difficile à apprendre, car possèdant plus de notions, mais par là même plus simple à utiliser, ces notions n'étant pas là sans bonne raison. De plus, je trouve qu'il est possible d'avoir en C++ une courbe d'apprentissage plus douce, même si le sommet est au final plus haut, alors que le C demande déjà plein de notions pour faire un premier programme.
    Citation Envoyé par Pierre Dolez Voir le message
    puis qu'il suppose la connaissance de C, en tout cas à mon avis.
    Là, pas d'accord. A un certain point, il supposera de connaître suffisemment le C pour s'interfacer avec lui, mais ne demande pas de savoir programmer en C.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    AnsiString? C'est du Borland C++ Builder ça. En C++ standard on ne connait que std::string du header <string>. Et c'est une vrai classe et tout et tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. convertir un tableau de char en double
    Par joffrey575 dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2015, 09h25
  2. [Débutant] Convertir un tableau de char en string
    Par Ludovic_R_37 dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/08/2013, 17h14
  3. convertir un tableau de char en float
    Par flamme34 dans le forum C++
    Réponses: 11
    Dernier message: 09/08/2012, 14h17
  4. Convertir un tableau de char en byte
    Par altahir007 dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/09/2011, 14h55
  5. Réponses: 1
    Dernier message: 13/10/2005, 15h10

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