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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    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 : 39
    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
    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));

  4. #4
    Membre Expert
    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 : 46
    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
    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 confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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 Expert
    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 : 46
    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
    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

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