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 :

formatage de données avec sprintf


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut formatage de données avec sprintf
    Bonjour,

    J'utilise une fonction sprintf pour mettre dans une chaine de caractère des données en fonction de la saisie de l'utilisateur.

    L'utilisateur peut saisir une valeur comprise entre 0 et 999999

    Pour des raisons techniques je récupère cette valeur dans une chaine de caractère et j'ai besoin de la mettre aussi dans une chaine de caractère mais impérativement sous la forme de 6 chiffres.

    En gros s'il saisie 24, il faut que sprintf me renvoi 000024.

    Mon code est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(strEntreeCTOAUT, "%06s",pstrCodeSaisi);
    Et il me retourne "____24" (des espaces à la place des 0)

    Comment faire pour récupérer "000024" et non "____24" ?


    Merci d'avance
    Hunter

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    L'attribut 0 ne fonctionne qu'avec les convertions numériques (d, i, o, u, x, X, a, A, e, E, f, F, g, et G), pour les autres le comportement est indéfini : man printf.

    Le plus simple est de commencer par convertir ta chaine de caractères en int (cf strtol).

  3. #3
    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 : 37
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char s1[7]="24";
    char s2[7]="";
    sprintf(s2,"%06ld",strtol(s1,NULL,10));
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Pour reprendre le code de seriousme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char s1[7]="24";
    char s2[7]="";
    sprintf(s2,"%06ld",atol(s1));
    à la différence que atol() ne détecte pas d'erreur

    man atol

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Ti-R
    Pour reprendre le code de seriousme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char s1[7]="24";
    char s2[7]="";
    sprintf(s2,"%06ld",atol(s1));
    à la différence que atol() ne détecte pas d'erreur

    man atol
    C'est justement pour cela qu'il ne faut pas utiliser atol ou atoi .....


    Si on veut faire les choses convenablement, il faudrait faire ceci :

    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
     
    char s1[16]="24";
    char s2[16], *beg;
     
    long tmp = strtol(s1,&beg,0);
     
    if(beg==s1) {
      /*Gestion de l'erreur*/
      fprintf(stderr,"Wow, grand probleme!!!\n");
    }
    else {
      if(snprintf(s2,sizeof(s2),"%06ld",tmp)<sizeof(s2)) {
         printf("Ici : %s\n",s2);
      }
      else  {
         fprintf(stderr, "s2 trop petit...\n");
      }
    }
    Jc

  6. #6
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Je suis d'accord, mais autant écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char s1[7]="24";
    char s2[7]="";
    sprintf(s2,"%06ld",atol(s1));
    Que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char s1[7]="24";
    char s2[7]="";
    sprintf(s2,"%06ld",strtol(s1,NULL,10));
    Quand on y est

    Mais c'est sur que ton code est bien mieux, car il gère les erreurs

    Je dirais même plus

    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
    char s1[16]="24";
    char s2[16], *beg;
     
    long tmp = strtol(s1,&beg,0);
     
    if(**beg!='\0') {
      /*Gestion de l'erreur*/
      fprintf(stderr,"Wow, grand probleme!!!\n");
    }
    else {
      if(snprintf(s2,sizeof(s2),"%06ld",tmp)<sizeof(s2)) {
         printf("Ici : %s\n",s2);
      }
      else  {
         fprintf(stderr, "s2 trop petit...\n");
      }
    }
    Suivant le man

  7. #7
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Si on veut vraiment pousser le vice de la sécurisation de code, alors il faut également mentionner la fonction snprintf() qui permet de limiter l'écriture dans la variable et ainsi se prémunir des dépassements de capacité.

    Seul inconvénient : la fonction est C99.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Ti-R
    Je dirais même plus
    Oui mais :

    ce serait plutôt :

    que

    Si on veut vraiment pousser le vice de la sécurisation de code, alors il faut également mentionner la fonction snprintf() qui permet de limiter l'écriture dans la variable et ainsi se prémunir des dépassements de capacité.
    Hmm, c'est pas ce que j'ai fait ?
    Jc

  9. #9
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par fearyourself
    Hmm, c'est pas ce que j'ai fait ?
    Jc
    Je crois qu'il est l'heure pour moi d'aller me chercher un café. Ou douze.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  10. #10
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par fearyourself
    Oui mais :

    ce serait plutôt :

    que

    Oui

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    En tout cas merci pour toute ces réponses !!!!

Discussions similaires

  1. Formatage de calculs avec données en référence.
    Par lapaixbordel dans le forum Excel
    Réponses: 3
    Dernier message: 22/03/2015, 00h03
  2. Formatage de données dans sprintf
    Par raplapente dans le forum Débuter
    Réponses: 2
    Dernier message: 17/07/2009, 16h17
  3. Formatage données avec sprintf
    Par El-Diablo- dans le forum C++Builder
    Réponses: 11
    Dernier message: 19/01/2008, 01h11
  4. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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