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 :

De int et long vers char*


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut De int et long vers char*
    Bonjour à tous,

    j'ai un programme avec les 4 variables suivante :

    int num_site, num_pm;
    long num_dossier, num_carte;


    que je voudrai transformer en char* :

    char *var2, *var3, *var4, *var5;


    et ajouter à la suite de chaine déjà existante :

    char *chaine2, *chaine3,* chaine4, *chaine5;

    chaine2="NumSit=";
    chaine3="NumDos=";
    chaine4="NumCar=";
    chaine5="NumPm=";


    Donc je veux transformer mes 2 int et 2 long en char* (var2, var3, var 4, var5) et les concaténer avec mes chaine2 à chaine5.

    Je n'y arrive pas.
    Merci de votre aide.

  2. #2
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Utilise des std::string en C++ tu te simplifieras la vie. Pour la conversion tout est dans la : http://c.developpez.com/faq/cpp/?pag...RINGS_numtostr

    Si après tu as besoin de char, tu peux récupérer le pointeur de caractères avec la méthode c_str() de std::string (tout est dans la FAQ aussi).

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pourquoi des char* et pas des std::string ? La concaténation est automatique dans ce cas. Et pour automatiser tout ce qui est dans la FAQ, il y a aussi Boost.Conversion : http://miles.developpez.com/tutoriel...st/conversion/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Alors des char*, pourquoi ?

    Tout simplement parceque ca va être des variables que j'envoie en paramètre à une fonction en C. En fait mes paramètre char* vont ensuite dans un char** que j'envoie en paramètre dans le "char** argv" du main d'une fonction C.

    Voilà le pourquoi


    Je ne veu donc pas convertir en string mais bien en char*.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu appelles une fonction main d'un programme en C ???

  6. #6
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Citation Envoyé par olivier857
    Tout simplement parceque ca va être des variables que j'envoie en paramètre à une fonction en C.
    Citation Envoyé par Fiquet
    Si après tu as besoin de char, tu peux récupérer le pointeur de caractères avec la méthode c_str() de std::string (tout est dans la FAQ aussi).
    Comme ça tu pourras convertir facilement avec les streams, et concaténer en faisant +, et enfin envoyer dans la fonction C avec la fonction c_str(). Si vraiment tu as besoin d'une chaîne modifiable, il faut faire une copie. Voir http://c.developpez.com/faq/cpp/?pag...TRINGS_to_char .

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Je ne veu donc pas convertir en string mais bien en char*.
    On peut convertir une "string" C++ en "char*" C avec la méthode "c_str()".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string s1("abcde");
    const char* s2=s1.c_str();

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par Miles
    Tu appelles une fonction main d'un programme en C ???
    Non, j'ai était un peu vite dans l'explication. C'est pas la fonction main, c'était juste pour imager.
    C'est une fonction en C mais pas le main puisque l e main est en c++, c' est la fonction dans laquelle je fait la convertion. Biensur la fonction C est dans un autre fichier.

    La fonction C est celle-ci : int post(int argc, char** argv);

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Est-ce qu'elle peut être re-prototypée comme suit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int post(int argc, char const* const * argv);
    Si oui, tu peux utiliser directement le contenu des std::string avec la fonction membre c_str().
    Sinon, un petit strdup() du header <cstring> suffira à te donner une copie des chaînes...
    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.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par Médinoc
    Est-ce qu'elle peut être re-prototypée comme suit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int post(int argc, char const* const * argv);
    Si oui, tu peux utiliser directement le contenu des std::string avec la fonction membre c_str().
    Sinon, un petit strdup() du header <cstring> suffira à te donner une copie des chaînes...

    Merci, mais non ca ne marche pas avec :
    ]int post(int argc, char const* const * argv);

    Je viens d'eesayer.

    Je vais essayer avec strdup.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Bon alors admettont que je prenne le schéma suivant :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <iostream>
    #include <cstdlib>
    #include <string>
     
    #include "post.h"
     
    using namespace std;
     
    int main(void)
    {
      int num_site, num_pm;
      long num_dossier, num_carte;
      string num_site_ch, num_dossier_ch, num_carte_ch, num_pm_ch;
     
      //mes entiers :
      num_site=366;
      num_dossier=246685;
      num_carte=41;
      num_pm=7; 
     
      //conversion entier vers string :
     
      quel est la meilleur méthode ?
     
      //mes début de chaine avant concaténation :
      num_site_str="SitNum=";
      num_dossier_str="Inddos=";
      num_carte_str="CarNum=";
      num_pm_str="MonNum=";
     
      //concaténation des 2 string :
     ...
     
      //conversion des string vers des char*:
      ...
    }

    Cela vous parait'il bien.

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    pourquoi tu ne fais pas :

    sprintf(variable_finale,"%s %ld", char, long);

    cette fonction t'enregistre dans variable_finale ton char suivi de ton long.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Bon alors je viens de faire cà :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <iostream>
    #include <sstream>
    #include <cstdlib>
    #include <string>
     
    #include "post.h"
     
    using namespace std;
     
    int main(void)
    {
      int num_site, num_pm;
      long num_dossier, num_carte;
      string num_site_str, num_dossier_str, num_carte_str, num_pm_str;
      std::ostringstream oss1, oss2, oss3, oss4;
      std::string num_site_str2, num_dossier_str2, num_carte_str2, num_pm_str2;
     
      //entiers :
      num_site=366;
      num_dossier=5248;
      num_carte=25;
      num_pm=256;  
     
      //débuts de chaine avant concaténation :
      num_site_str="SitNum=";
      num_dossier_str="Inddos=";
      num_carte_str="CarNum=";
      num_pm_str="MonNum=";
     
     
      // Convertie les entiers en string :
      oss1 << num_site;
      num_site_str2 = oss1.str();
      oss2 << num_dossier;
      num_dossier_str2 = oss2.str();
      oss3 << num_carte;
      num_carte_str2 = oss3.str();
      oss4 << num_pm;
      num_pm_str2 = oss4.str();
     
      //concaténation des 2 string :
      num_site_str+=num_site_str2;
      num_dossier_str+=num_dossier_str2;
      num_carte_str+=num_carte_str2;
      num_pm_str+=num_pm_str2;
      cout << num_site_str << endl;
      cout << num_dossier_str << endl;
      cout << num_carte_str << endl;
      cout << num_pm_str << endl;
     
      //conversion des string vers les char*:
     .....
    }
    C'est donc presque fini.


    Mais je viens de voir çà :

    Citation Envoyé par orj30754
    pourquoi tu ne fais pas :

    sprintf(variable_finale,"%s %ld", char, long);

    cette fonction t'enregistre dans variable_finale ton char suivi de ton long.
    Effectivement ca me parait bien sympa :

    je vais eesayer ca parait bcp plus simple et rapide. mais est-ce que c'est bien propre?

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Non, tu dois allouer la mémoire en plus... Si tu veux qqch qui ressemble, regarde du côté de Boost.Format.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Voilà ca fait çà :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <iostream>
    #include <cstdlib>
    #include <string>
     
    #include "post.h"
     
    using namespace std;
     
    int main(void)
    {
      int nb_parm, i;
      char *param[10];
      int num_site, num_pm;
      long num_dossier, num_carte;
      char *num_site_ch, *num_dossier_ch, *num_carte_ch, *num_pm_ch;
      char *num_site_ch2, *num_dossier_ch2, *num_carte_ch2, *num_pm_ch2;
     
      //entiers :
      num_site=366;
      num_dossier=26846;
      num_carte=86;
      num_pm=7;  
     
      //débuts des chaines avant concaténation :
      num_site_ch="SitNum=";
      num_dossier_ch="Inddos=";
      num_carte_ch="CarNum=";
      num_pm_ch="MonNum=";
     
      //allocation mémoire :
      param[2]=(char *)malloc(strlen(num_site_ch)+4);
      param[3]=(char *)malloc(strlen(num_dossier_ch)+13);
      param[4]=(char *)malloc(strlen(num_carte_ch)+13);
      param[5]=(char *)malloc(strlen(num_pm_ch)+4);  
     
      //concaténations des débuts de chaine avec les entiers :
      sprintf(param[2],"%s %d", num_site_ch, num_site);
      sprintf(param[3],"%s %ld", num_dossier_ch, num_dossier);
      sprintf(param[4],"%s %d", num_carte_ch, num_carte);
      sprintf(param[5],"%s %d", num_pm_ch, num_pm);
     
      nb_parm=5;
     
      cout << param[2] << endl;
      cout << param[3] << endl;
      cout << param[4] << endl;
      cout << param[5] << endl;
     
      for(i=0; i<nb_parm; i++)
      {
        free(param[i]);
      }
    }
    Est-ce juste ?

  16. #16
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Là ce n'est plus du C++ mais du C ... La méthode précédente était mieux. sprintf() est une fonction héritée du C et qui peut être dangeureuse si l'on ne fait pas attention aux buffers qu'on lui passe.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par Fiquet
    Là ce n'est plus du C++ mais du C ... La méthode précédente était mieux. sprintf() est une fonction héritée du C et qui peut être dangeureuse si l'on ne fait pas attention aux buffers qu'on lui passe.

    Mois je suis newbee et je vous fait confiance.

    Les 2 méthodes fonctionnent pour le moment mais effectivement il y en a certainement l'une mieux que l'autre. Plus stable et moins dangeurese, apparement c'est la 1ère d'après ce que tu me dit, donc je prend. Par contre il faut que je la finisse en faisant la conversion string vers char*. je vais retourner sur la faq pour cà.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Alors si je reprend la 1ère méthode j'ai ca :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <iostream>
    #include <sstream>
    #include <cstdlib>
    #include <string>
     
    #include "post.h"
     
    using namespace std;
     
    int post_name(char* site, char* dossier);
    int post_solde(char* site, char* dossier, char* carte, char* pm);
     
    int main(void)
    {
    	int num_site, num_pm;
    	long num_dossier, num_carte;
    	string num_site_str, num_dossier_str, num_carte_str, num_pm_str;
    	std::ostringstream oss1, oss2, oss3, oss4;
    	std::string num_site_str2, num_dossier_str2, num_carte_str2, num_pm_str2;
    	char *num_site_ch, *num_dossier_ch, *num_carte_ch, *num_pm_ch;
     
    	//entiers :
    	num_site=26;
    	num_dossier=2280;
    	num_carte=21;
    	num_pm=1;  
     
    	//débuts de chaine avant concaténation :
    	num_site_str="SitNum=";
    	num_dossier_str="Inddos=";
    	num_carte_str="CarNum=";
    	num_pm_str="MonNum=";	
     
    	// Convertie les entiers en string :
    	oss1 << num_site;
    	num_site_str2 = oss1.str();
    	oss2 << num_dossier;
    	num_dossier_str2 = oss2.str();
    	oss3 << num_carte;
    	num_carte_str2 = oss3.str();
    	oss4 << num_pm;
    	num_pm_str2 = oss4.str();
     
    	//concaténation des 2 string :
    	num_site_str+=num_site_str2;
    	num_dossier_str+=num_dossier_str2;
    	num_carte_str+=num_carte_str2;
    	num_pm_str+=num_pm_str2;
    	cout << num_site_str << endl;
    	cout << num_dossier_str << endl;
    	cout << num_carte_str << endl;
    	cout << num_pm_str << endl;
     
    	//conversion des string vers les char*:
    	num_site_ch=num_site_str.c_str();
    	num_dossier_ch=num_dossier_str.c_str();
    	num_carte_ch=num_carte_str.c_str();
    	num_pm_ch=num_pm_str.c_str();
    Mais j'ai encore un pb car la dernière étape ne me convient pas, ca plante d'ailleurs et c'est normal. Car je ne veu pas une conversion string vers const char* mais vers char *, je n'ai pas le choix a cause de la fonction à laquel je me plug . Donc le .c_str() ne me convient pas, car il transforme le string en const char* et non char*.

  19. #19
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Je t'ai déjà expliqué avant. Lis ça (particulièrement la deuxième partie) : http://c.developpez.com/faq/cpp/?pag...TRINGS_to_char

  20. #20
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par olivier857
    Alors si je reprend la 1ère méthode j'ai ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	//conversion des string vers les char*:
    	num_site_ch=num_site_str.c_str();
    	num_dossier_ch=num_dossier_str.c_str();
    	num_carte_ch=num_carte_str.c_str();
    	num_pm_ch=num_pm_str.c_str();
    Mais j'ai encore un pb car la dernière étape ne me convient pas, ca plante d'ailleurs et c'est normal. Car je ne veu pas une conversion string vers const char* mais vers char *, je n'ai pas le choix a cause de la fonction à laquel je me plug . Donc le .c_str() ne me convient pas, car il transforme le string en const char* et non char*.
    tu as la fonction membre std::string::copy() pour extraire le contenu de la chaine et la mettre dans un tampon modifiable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::string s = "Foobar";
    char foobar[30] = { '\0' };
    s.copy(foobar, sizeof(foobar)/sizeof*foobar - 1);
    C'est sûr mais ça a le même défaut que strncpy() en C si la longueur de la chaine source est bien plus petite que la taille du tampon de destination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string s = "Foobar";
    char foobar[30] = { '\0' };
    if ( s.length() < sizeof(foobar)/sizeof*foobar ) {
       s.copy(foobar, s.length());
    }
    A+

Discussions similaires

  1. [DEBUTANT]Convertion int vers Char*
    Par magnus2005 dans le forum Débuter
    Réponses: 13
    Dernier message: 01/04/2007, 11h15
  2. [question] cast de long vers int
    Par Faiche dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2006, 10h22
  3. Réponses: 2
    Dernier message: 24/03/2006, 10h46
  4. LONG RAW vers CHAR
    Par morti dans le forum Oracle
    Réponses: 8
    Dernier message: 31/12/2005, 14h21
  5. Réponses: 1
    Dernier message: 20/12/2005, 17h51

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