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 averti
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    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 Expert
    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
    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 averti
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

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

  4. #4
    Membre confirmé
    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
    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Bonjour,
    regarde du coté de boost.format
    http://www.boost.org/libs/format/doc/format.html

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    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 émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 Expert
    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
    Par défaut
    oui désolé, j'ai cru que sprintf et printf étaient pareils.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    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 émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 Expert
    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
    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 averti
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 390
    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 390
    Par défaut
    Il me semble que boost.format est supposé répondre à ce problème.
    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.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    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