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 :

sprintf avec des std::string


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut sprintf avec des std::string
    Bonjour,

    Je reprend actuellement un projet utilisant des CString, par souci de propreté, j'ai besoin de les remplacer par des std::string.
    La classe CString permet de faire un format, du meme style que sprintf (fonction .format).

    J'aimerai savoir si il existe un moyen propre de formatter une std::string à la sauce sprintf.

    stringA = "string de test n°%s a été lu"
    stringB = "18"

    "string de test n°18 a été lu"

    Merci de m'avoir lu

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par Bart_lx Voir le message
    Bonjour,

    Je reprend actuellement un projet utilisant des CString, par souci de propreté, j'ai besoin de les remplacer par des std::string.
    La classe CString permet de faire un format, du meme style que sprintf (fonction .format).

    J'aimerai savoir si il existe un moyen propre de formatter une std::string à la sauce sprintf.

    stringA = "string de test n°%s a été lu"
    stringB = "18"

    "string de test n°18 a été lu"

    Merci de m'avoir lu
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(stringA.c_str(), stringB.c_str());

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    La fonction .c_str() renvoie un const char * qui par définition n'est pas modifiable.

  4. #4
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par Bart_lx Voir le message
    La fonction .c_str() renvoie un const char * qui par définition n'est pas modifiable.
    Tu peux passer par une chaine intermédiaire?

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    regarde du coté de boost.format
    http://www.boost.org/libs/format/doc/format.html

  6. #6
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    La solution de passer par une chaine intermediaire me parait utilisable.
    --------
    char cTmp[256];
    sprintf(cTmp,mSiritCmd.mcsConnectionId.c_str(),mcsConnectionId);
    sCmd = cTmp;
    --------

    J'ai juste parcouru la librairie boost, mais je tiens a garder le code aussi clair et simple que possible.
    Merci pour vos réponses.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(stringA.c_str(), stringB.c_str());
    Oulala, mon dieu mais quelle horreur.
    Non seulement on déconseille à longueur de journée d'utiliser ces saletés de fonctions en C++, mais même en C ça n'a rien de correct. Si au moins c'était un appel à snprintf et écrit normalement...
    Quand à boost::format, ça ne se justifie pas ici puisque les flux de la stl suffisent amplement pour une utilisation aussi simple. Utilise std::stringstream et va jeter un coup d'oeil aux manipulateurs qui sont décris dans la faq: http://cpp.developpez.com/faq/cpp/?p...stream_iomanip .

  8. #8
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    oui désolé, j'ai cru que sprintf et printf étaient pareils.

  9. #9
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Zais_ethael,

    Je n'arrive pas a voir comment formater ma chaine avec un stringstream comme je le ferai avec le sprintf. (j'ai consulter la faq mais je ne vois pas).
    Merci en tout cas pour ta réponse

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    La syntaxe n'a rien à voir mais tu peux faire exactement la même chose, pour ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    stringstream ss;
    ss << "string de test n°" << stringB << " a été lu";
    Et si besoin, tu utilises les manipulateurs pour formater l'affichage des nombres par exemple.

  11. #11
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    il n'y a pas besoin d'utiliser les stringstream.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    int main()
    {
    	string A = "18";
    	string B = "abc"+A+"def";
    	cout << B << endl;
     
            return 0;
    }

  12. #12
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    J'ai du mal m'expliquer car les réponses ne correspondent pas à la question.

    l'interet du sprintf reste le formatage de la chaine et le remplacement des clefs "%d pour un int, %s pour une chaine... etc.

    Le probleme n'est pas la concaténation de 2 strings ou d'ajouter un string dans une autre non.
    Le probleme est que je recupere une chaine dans un fichier de config de la forme :
    string A("reader.register_event(%s,event.tag.report)");
    string B("18");

    Dans le déroulement de mon code, je vais récuperer le port sur lequel doivent etre envoyé les infos, donc un int.
    L'interet est d'inserer la valeur du port dynamique dans la chaine dans le programme.

    /* Idéalement */
    Fonction : sprintf(A,B);

    J'ai besoin de faire un truc propre, et pas :
    /* Attention c'est moche */
    string B("18");
    string Out ("reader.register_event(");
    Out+= B;
    Out+= ",event.tag.report)";

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Il me semble que boost.format est supposé répondre à ce problème.

  14. #14
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Ok pour boost alors.

    Merci pour vos réponses.

Discussions similaires

  1. Sprintf avec des caractères poucentages dans le format
    Par ClemLamb dans le forum Langage
    Réponses: 4
    Dernier message: 29/09/2010, 00h15
  2. Les nombres dans des std::string
    Par camboui dans le forum SL & STL
    Réponses: 41
    Dernier message: 11/02/2009, 17h55
  3. Réponses: 14
    Dernier message: 30/06/2008, 18h53
  4. Réponses: 7
    Dernier message: 01/09/2006, 14h19
  5. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46

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