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++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    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 : 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 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 à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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;
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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 : 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
    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 à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    si c'est cela comment résoudre mon problème, car dans ma fonction c'est ma variable membre ?

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    On peut voir tout le code, du moins la classe et le main?

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    voici ma classe, c'est une classe dérivée de Produit :
    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
    23
    24
    25
    Sandwich::Sandwich(float hauteur_prod,float prix_prod,const string & chaine): Produit(hauteur_prod,prix_prod) {
    	cout << "Construction d'un objet de type Sandwich \n";	
    	date_lim_conso=chaine;
    }
     
    Sandwich::~Sandwich(){
    	cout << "destruction d'un objet de type Sandwich \n";	
    }
     
    string Sandwich::ObtenirDateLimConso()const{
    	return date_lim_conso;
    }
     
    void Sandwich::AfficherDatelim()const{
    	cout << "date limite de consommation : " << date_lim_conso << "\n" ;
    }
     
    void Sandwich::AfficherProd()const{
    	Produit::AfficherProd();
    	this->AfficherDatelim();
    }
     
    char Sandwich::ObtenirType()const{
    	return 'S';
    }
    des bouts de mon main :

    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
    int main(void){
    	// Initialisation d'un tableau dynamique
    	int taille=4;
    	Produit** tab;
    	tab=new Produit*[taille];
            tab[1]=new Sandwich(4.0,5.0,"1993 12 09");
    	cout << "\n<SANDWICH> \n \n" ;
    	tab[1]->AfficherProd();
     
    	for(unsigned int i=0; i<taille; i++)
    	{
    		//boucle pour eliminer les tab[i]
    		if(tab[i]!=NULL)
    		{delete tab[i];
    		tab[i]=NULL;}
    	}
     
    	//boucle pour eliminer tab
    	if(tab!=NULL)
    	{delete [] tab;
    	tab=NULL;}
    Mon souci, avec valgrind sont les fuites memoires qui s'eliminent dès que je mets en commentaire cette ligne : et les ERRORS qui proviennent de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "date limite de consommation : " << date_lim_conso << "\n" ;
    merci d'avance

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Salut,

    La variable date_lim_conso est membre de la classe Produit, peut-on voir sa déclaration dans Produit.h?

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    non date_lim_conso se trouve dans sandwich, voilà le .h :
    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
    23
    24
    using namespace std;
     
    class Sandwich : public Produit{
     
    	private :
    		// à voir comment il faut la déclarer
    		string date_lim_conso;
     
    	public :
    		// CONSTRUCTEUR
    		Sandwich(float hauteur_prod,float prix_prod,const std::string & chaine);
     
    		// DESTRCUTEUR
    		~Sandwich();		
     
    		// ACCESSEURS
    		virtual string ObtenirDateLimConso()const;
     
    		// AFFICHAGE
    		virtual void AfficherDatelim()const;
    		virtual void AfficherProd()const;
     
    		virtual char ObtenirType()const;
    };

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