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() et format de sortie dans buffer


Sujet :

C

  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut sprintf() et format de sortie dans buffer
    Bonjour,

    Ayant besoin de formater un zone, j'ai trouvé l'instruction sprintf() qui répond exactement à ce que je veux réaliser.
    Cependant je souhaite utiliser pour la taille de sortie une longueur données dans un #define
    ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define TAILLE   10
    ~
    ~
    char buffer[TAILLE+1];
    ~
    ~
    sprintf(buffer,"%0TAILLEs",data);
    La compilation ne pose pas de problème, cependant dans buffer j'ai
    TAILLEs au lieu de la valeur de la data (qui est de type int)

    Cette ecriture est-elle possible ou dois je obligatoirement mettre la longueur
    %10s ?

    Merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le flag 0 n'est pas défini pour un %s.

    Tu parles de formater une zone. Qu'est-ce que tu entends par là ? Que veux-tu mettre dans cette zone (donne éventuellement un exemple) ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Tu peux essayer ça :

    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
    #include <stdio.h>
     
    #define TAILLE   10
     
    #define VALEUR(valeur) #valeur
    #define INT_2_STR(valeur) VALEUR(valeur)
     
    int main(void)
    {
    	char buffer[TAILLE+1];
    	char data[10]="test";
     
    	sprintf(buffer,"%" INT_2_STR(TAILLE) "s",data);
    	printf("%s\n", buffer);
     
    	return 0 ;
    }

  4. #4
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    En fait pour exemple
    J'ai un int qui a pour valeur 99
    Je veux le stocker dans une variable de type char sur 10 sous la forme suivante:
    0000000099

    jeroman je vais tester ta solution

  5. #5
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Peut-être pourrais tu "construire" ton format ?
    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
    #define TAILLE  10
     
    int main(int argc, char *argv[])
    {
        char monFormat[50] = "" ;
        char buffer[TAILLE+1] = "" ;
     
        char data[10] = "test" ;
     
        sprintf(monFormat, "%%%ds", TAILLE) ; // monFormat = "%10s"
        sprintf(buffer, monFormat, data) ;
        sprintf("%s\n", buffer) ;
     
        return EXIT_SUCCESS ;
    }
    Sinon, pour afficher une variable dans le format "00000099" tu peux faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int test = 99 ;
    printf("%.10d\n", test) ;

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    En fait pour exemple
    J'ai un int qui a pour valeur 99
    Je veux le stocker dans une variable de type char sur 10 sous la forme suivante:
    0000000099
    Dans ce cas, ce serait plutôt un code comme ça alors :
    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
    #include <stdio.h>
     
    #define TAILLE   10
     
    #define VALEUR(valeur) #valeur
    #define INT_2_STR(valeur) VALEUR(valeur)
     
    int main(void)
    {
    	char buffer[TAILLE+1];
    	int valeur = 99 ; /* au pif */
     
    	sprintf(buffer,"%0" INT_2_STR(TAILLE) "d" , valeur);
    	printf("%s", buffer);
     
    	return 0 ;
    }

  7. #7
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    jeroman je vais tester ta solution
    ça ne fonctionne pas, j'ai bien ma zone sur 10 mais vide (10 spaces)
    La valeur du data est bonne je fait un display juste avant le sprintf()

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ce n'est pas un %s qu'il te faut alors.
    Si tu utilises la méthode de jeroman il faut changer le format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(buffer,"%0" INT_2_STR(TAILLE) "d",data);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(buffer,"%." INT_2_STR(TAILLE) "d",data);
    Sinon, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(buffer,"%0*d",TAILLE,data)

  9. #9
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Merci pour cette réponse, je venais de faire une modification dans le sens de ce que tu me décris et ça fonctionne !!!

    J'ai une petite question subsidiaire, à propos de la solution proposée notamment
    sur les #define
    En regardant la documentation C je pense que c'est ce que l'on appel une MACRO.
    Seul problème je ne comprend pas comment elle fonctionne.
    Une petite explication (si c'est pas trop demandé) serait bien venue

    MERCI

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    En regardant la documentation C je pense que c'est ce que l'on appel une MACRO. Seul problème je ne comprend pas comment elle fonctionne. Une petite explication (si c'est pas trop demandé) serait bien venue
    C'est par ici : http://melem.developpez.com/tutoriel...age=demo#LII-C

    L'idée générale est qu'il s'agit de symboles qui sont substitués, dans le code, par leur valeur, avant que le programme soit effectivement compilé. Ces macros peuvent éventuellement prendre des paramètres. Une fois l'exécutable produit, ces macros n'existent plus en tant que telles.

    L'exemple le plus célèbre est le suivant :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    #define SIX  1+5
    #define NEUF 8+1
     
    int main (void)
    {
        printf ("%d\n",SIX * NEUF);
        return 0;
    }

    L'expression « SIX * NEUF » a été développée en « 1+5 * 8+1 » et, seulement ensuite, a été analysée et résolue en 42.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define VALEUR(valeur) #valeur
    Le dièse permet de donner la chaine de caractère de ce qu'on passe en paramètre. Si valeur vaut 10, la macro donnera "10".
    Le problème, c'est que si on envoie DATA comme valeur à cette macro, la chaine sera "DATA" et non pas la valeur de DATA entre guillemets. Il faut donc feinter. Il faut alors utiliser une seconde macro où l'on envoie la valeur de DATA, afin d'obtenir la chaine correspondante.

    Dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define VALEUR(valeur) #valeur
    #define INT_2_STR(valeur) VALEUR(valeur)
    (...)
    sprintf(buffer,"%0" INT_2_STR(TAILLE) "d" , valeur);
    (...)
    On envoie TAILLE à INT_2_STR. Cette macro utilise la macro VALEUR en remplaçant DATA par sa valeur, ici 10. VALEUR se charge alors de remplacer 10 par "10".

    Au final, on se retrouve avec une chaine du style . Or, en C, cela correspond à la même chose que "%010d". Car en C, on peut découper une chaine en plusieurs morceaux, à condition de bien les délimiter par des guillemets.

    Par exemple, sera compilé comme si on avait écrit Cela permet notamment l'utilisation des macros comme dans l'exemple.

  12. #12
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Là franchement, pour toutes ces explications

    Il ne me reste plus qu'a mettre le tag résolu

    MERCI

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Citation Envoyé par diogene Voir le message
    Sinon, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(buffer,"%0*d",TAILLE,data)
    Est-ce du C Standard ou bien du GNU C, ça?
    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
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est du C standard.

  15. #15
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Dans ce cas je prend le standard

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Format de sortie xml dans un servlet
    Par tamildark dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 28/02/2011, 13h07
  2. Sprintf avec des caractères poucentages dans le format
    Par ClemLamb dans le forum Langage
    Réponses: 4
    Dernier message: 29/09/2010, 00h15
  3. Format de sortie dans Transformer 8.4
    Par sofiane_bfm007 dans le forum Cognos
    Réponses: 1
    Dernier message: 09/06/2010, 10h31
  4. Création des états de sortie dans JBuilder ?
    Par k_hamza75 dans le forum JBuilder
    Réponses: 2
    Dernier message: 15/11/2004, 11h44
  5. [LG]Formater le texte dans un WriteLn
    Par busy999 dans le forum Langage
    Réponses: 16
    Dernier message: 15/11/2003, 11h16

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