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

Langage C++ Discussion :

char*, String et strcpy


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Par défaut char*, String et strcpy
    Bonjour,

    En c++ je veux réaliser un constructeur qui pred une chaine de caractère en entrée pour un des attributs. J'ai essayé plusieurs mais j'ai toujours plusieurs messages d'erreur quelque soit la solutions que j'essayer :

    voici comment j'initialise mon objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[1]=new Sandwich(4.0,5.0,"1993 12 09");
    Dans ma classe et mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sandwich::Sandwich(float hauteur_prod,float prix_prod,char* chaine): Produit(hauteur_prod,prix_prod) {
    	cout << "Construction d'un objet de type Sandwich \n";	
    	// solution 1 :
            strcpy(date_lim_conso,chaine);
    	//solution 2:
            date_lim_conso=chaine;
    }
    J'ajoute également que j'ai essayé de mettre des const sans succès ...

    question 1) Quand je mets strcpy j'ai un core dumped, mais avec la solution 2 j'ai un warning conversion from string constant to char*, mon programme marche mais j'aimerai enlever ce message d'erreur, comment faire ?
    question 2) Vais je pouvoir utiliser les autres fonctions de la bibliothèque String?

    Merci d'avance

    Lucile

  2. #2
    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 : 50
    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
    Par défaut
    Citation Envoyé par foetus Voir le message
    [*]Toujours terminer ces chaînes par '\0': "1993 12 09\0". Cela peut aussi venir de là ton problème.
    Un littéral de chaîne est déjà fini par 0, pas la peine d'en mettre un second...

    Sinon, même si je suis d'accord qu'une chaîne de caractères n'est probablement pas idéale ici, si on voulait en faire une, il faudrait oublier ces char*, et utiliser std::string à la place !

    http://cpp.developpez.com/faq/cpp/?p...s-en-Cplusplus
    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.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Un littéral de chaîne est déjà fini par 0, pas la peine d'en mettre un second...

    Sinon, même si je suis d'accord qu'une chaîne de caractères n'est probablement pas idéale ici, si on voulait en faire une, il faudrait oublier ces char*, et utiliser std::string à la place !

    http://cpp.developpez.com/faq/cpp/?p...s-en-Cplusplus
    Question 1) j'ai tout fait en char* : tout a compilé mais valgrind affiche une erreur :
    j'ai idetnifié ou cela posait problème c'est dans une de mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "date limite de consommation : " << date_lim_conso << "\n" ;
    avec mon attribut date_im_conso qui est déclaré : date_lim_conso[10]
    Pourquoi cela pose t il problèem au niveau de valgrind :
    ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

    ce n'est pas une fuite mémoire alors qu'est ce que c'est ?
    Question 2) J'ai essayé de passer tout en string
    mon attribut : mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Sandwich::Sandwich(float hauteur_prod,float prix_prod,const char* chaine): Produit(hauteur_prod,prix_prod) {
    	cout << "Construction d'un objet de type Sandwich \n";	
    	string date_lim_conso(chaine);
    }
    Mon soucis se pose au niveau de la construction de mon date_lim_conso, pour la recopie, comment faire, je suis completement perdue avec les string.
    De plus comment j'utilise strncpy sur des string, sachant qu'elle prend des chr*

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par superlucile Voir le message
    J'ai essayé de passer tout en string
    C'est la bonne solution.

    Citation Envoyé par superlucile Voir le message
    mon attribut :
    En C++, on ne parle pas d'attributs, mais de variables membres.
    Idem pour les méthodes: on ne parle pas de méthode, mais de fonction membre.
    Je sais ça peut paraître stupide d'avoir une terminologie différente d'un langage à l'autre, mais en fait cela cache de réelles et importantes différences.

    Citation Envoyé par superlucile Voir le message
    mon constructeur : Sandwich::Sandwich(float hauteur_prod,float prix_prod,const char* chaine)
    Pourquoi ne pas aller jusqu'au bout, et faire plutôt: Sandwich::Sandwich(float hauteur_prod,float prix_prod,const string & chaine)?

    Citation Envoyé par superlucile Voir le message
    De plus comment j'utilise strncpy sur des string, sachant qu'elle prend des chr*
    Il ne faut pas utiliser les fonctions "C legacy" comme strcpy, strcomp, etc,. La classe string propose tout un tas de constructeurs, de fonctions membres et d'opérateurs (sans parler de <algorithm>) qui te permettent de faire tout ça.
    Par exemple pour copier une chaine, plus besoin de passer par strcpy, il suffit de faire chaine1 = chaine2;

  5. #5
    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 : 50
    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
    Par défaut
    Quand tu écris string date_lim_conso(chaine); dans ton constructeur, tu définis une nouvelle variable, et donc, tu ne modifies plus ta donnée membre. Fais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sandwich::Sandwich(float hauteur_prod,float prix_prod,const char* chaine): 
        Produit(hauteur_prod,prix_prod),
        date_lim_conso(chaine)
    {
    	cout << "Construction d'un objet de type Sandwich \n";	
    }
    Sinon, je suis d'accord avec rOd, passe en string jusqu'au bout !
    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.

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Par défaut
    Citation Envoyé par r0d Voir le message
    Pourquoi ne pas aller jusqu'au bout, et faire plutôt: Sandwich::Sandwich(float hauteur_prod,float prix_prod,const string & chaine)?
    Merci de votre aide à tous !! J'ai reussi en string, mais j'ai deux autres questions :

    voilà ce que m'affiche valgrind :
    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
    ==3310== HEAP SUMMARY:
    ==3310==     in use at exit: 46 bytes in 2 blocks
    ==3310==   total heap usage: 7 allocs, 5 frees, 126 bytes allocated
    ==3310== 
    ==3310== 46 bytes in 2 blocks are definitely lost in loss record 1 of 1
    ==3310==    at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==3310==    by 0x40D57D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
    ==3310==    by 0x40D7A47: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
    ==3310==    by 0x40D7BB5: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
    ==3310==    by 0x41614D2: (below main) (libc-start.c:226)
    ==3310== 
    ==3310== LEAK SUMMARY:
    ==3310==    definitely lost: 46 bytes in 2 blocks
    ==3310==    indirectly lost: 0 bytes in 0 blocks
    ==3310==      possibly lost: 0 bytes in 0 blocks
    ==3310==    still reachable: 0 bytes in 0 blocks
    ==3310==         suppressed: 0 bytes in 0 blocks
    ==3310== 
    ==3310== For counts of detected and suppressed errors, rerun with: -v
    ==3310== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    1) Les deux pertes sont du à mes deux objets qui utilisent des variables membres string. Et donc, pour la classe string pour éviter les fuites mémoires je dois appeler le destructeur de la classe string ? Mais à priori je n'ai pas de pointeur ici ... donc je peux pas faire de delete
    2) La 2ème erreur (ERROR SUMMARY) vient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "date limite de consommation : " << date_lim_conso << "\n" ;
    , avez vous une idée ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Si je comprends bien la dernière ligne de la stack trace, il s'agit d'une variable globale.
    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.

Discussions similaires

  1. Convertir un const unsigned char * à string
    Par anas.eh dans le forum C++
    Réponses: 4
    Dernier message: 04/08/2008, 22h40
  2. Problème d'affectation Char String
    Par smail21 dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2007, 00h00
  3. Transtypage int => char, String => char
    Par autregalaxie dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 10/04/2007, 13h48
  4. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 11h33
  5. Réponses: 3
    Dernier message: 26/05/2004, 23h03

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