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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

+ 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