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 :

écrasement avec sprintf


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Points : 23
    Points
    23
    Par défaut écrasement avec sprintf
    Bonjour, une petite question relative à un écrasement et je n'arrive pas à trouver d'où cela vient.

    J'essaie d'imprimer exactement un entier sur 4 caractères, cela semble fonctionner mais le champ qui suit dans la structure se retrouve écrasé.

    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
    19
    20
    21
    #include <stdio.h>
    #include <string.h>
     
    struct s
    {
        char code[4];
        char utilisateur[12];
    } s;
    main(int argc, char **argv)
    {
     
        int val=3456;
        memset(s.utilisateur, ' ', sizeof(s.utilisateur));
        (void)strcpy(s.utilisateur, "123456");
        (void)printf("before %s\n", s.utilisateur);
        sprintf(s.code, "%4.4d\n", val);
        printf("after %s\n", s.utilisateur);
        printf("after %x\n", s.utilisateur[0]);
        printf("after %x\n", s.utilisateur[1]);
        printf("after %x\n", s.utilisateur[2]);
    }
    Et dans le résultat de sortie, on constate que le champ utilisateur est écrasé :-(

    before 123456
    after

    after a
    after 0
    after 33
    Je soupçonne fortement le sprintf de s'être un peu étalé mais quelle est la bonne syntaxe ?

    Merci de vos lumières.

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Je crois que le '\n' est de trop.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Milles excuses et effectivement, le \n est de trop mais hélas, cela ne change rien.

    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
    19
    20
    21
    #include <stdio.h>
    #include <string.h>
     
    struct s
    {
        char code[4];
        char utilisateur[12];
    } s;
    main(int argc, char **argv)
    {
     
        int val=3456;
        memset(s.utilisateur, ' ', sizeof(s.utilisateur));
        (void)strcpy(s.utilisateur, "123456");
        (void)printf("before %s\n", s.utilisateur);
        sprintf(s.code, "%4.4d", val);
        printf("after %s\n", s.utilisateur);
        printf("after %x\n", s.utilisateur[0]);
        printf("after %x\n", s.utilisateur[1]);
        printf("after %x\n", s.utilisateur[2]);
    }
    % make jm && ./jm
    cc jm.c -o jm
    before 123456
    after
    after 0
    after 32
    after 33
    Mon sprintf rajoute un \0 après les 4 caractères.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Après lecture de http://stackoverflow.com/questions/3...ull-space-in-c, il semble que le sprintf rajoute un \0 donc je viens d'opter pour la recopie dans un buffer temporaire dont j'extrait les 4 premiers caractères.
    merci pour tout

  5. #5
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par maxine Voir le message
    Après lecture de http://stackoverflow.com/questions/3...ull-space-in-c, il semble que le sprintf rajoute un \0
    Normal c'est le principe des chaîne caractère en C. C'est le contraire qui serait étonnant.

    En passant pour ton memset(), sizeof(s.utilisateur) va te donner la taille du pointeur et non la longueur de ton tableau.

    Sinon ton champs code est pas assez grand pour recevoir ta chaîne formatée.


  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Citation Envoyé par moins1 Voir le message
    En passant pour ton memset(), sizeof(s.utilisateur) va te donner la taille du pointeur et non la longueur de ton tableau.
    Faux. Il renverra bien la taille du tableau et non du pointeur !

    Exemple :

    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
    #include <stdio.h>
     
    typedef struct test
    {
      char  t[6];
      int   a[6];
    } test;
     
    int main(void)
    {
      test  t;
     
      printf("size : %d\nsize2 : %d\n", sizeof(t.t), sizeof(t.a));
      return 0;
    }
    On verra s'afficher 6 puis 24. C'est la (petite) difference entre un tableau et un pointeur sur tableau.

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

Discussions similaires

  1. Probleme avec sprintf et affichage?
    Par nanettemontp dans le forum C++
    Réponses: 16
    Dernier message: 15/10/2007, 15h45
  2. Problème avec sprintf
    Par LinuxUser dans le forum C
    Réponses: 9
    Dernier message: 18/05/2007, 16h34
  3. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 02h12
  4. formatage de données avec sprintf
    Par hunter001 dans le forum C
    Réponses: 10
    Dernier message: 18/08/2006, 09h05
  5. probleme avec sprintf
    Par semaj_james dans le forum C
    Réponses: 5
    Dernier message: 09/12/2005, 21h07

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