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 :

Problème au niveau du sprintf


Sujet :

C

  1. #1
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut Problème au niveau du sprintf
    Bonjour à tous,

    j'ai écrit une fonction en C qui transforme un tableau de bytes en un string.
    Ma fonction marche super bien sous Linux. Maintenant, je suis passé à Windows pour la tester et là ça fait des trucs bizarres, d'après mes tests c'est le sprintf qui foire.

    Voyez vous c'est quoi le problème?? car moi ça m'a rendu fou

    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
    22
    23
     
    #include <stdio.h>
    #include <string.h>
     
    void bytesToString(unsigned char *bytes,int t_bytes,char *string){
     
       int i; 
       char tmp[]="00";
     
        for(i=0;i<t_bytes;i++){
            sprintf(tmp,"%02hx",bytes[i]);
            strcat(string,tmp);
        }
    }
     
    int main(){
     
            unsigned char bytes[4]={0xf1,0xf2,0xf3,0xf4};
            char str[2*4+1];
            bytesToString(bytes, 4,str);
            printf("\n%s\n",str);
            return 0;
    }
    Merci,
    ilikecz

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    As-tu vérifié que ce n'est un problème de little/big endian ?

    Sinon tu as une solution relativement simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char conversion[] = '1','2',....'F';
    tab[i] = conversion[nombre%16];
    tab[i+1] = conversion[nombre/16];

  3. #3
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Merci pour ton code, mais franchement je préfère le mien pour la simple raison que cette fonction je l'utilise un petit peu partout dans mon projet, donc je ne veux pas changer.

    ce qui m'étonne c'est le comportement du sprintf qui, en faisant un debug, j'ai pu remarqué qu'il s'exécute une fois et après on sort directement de la boucle, avec une valeur de i=49

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Déjà ton code minimal ne compile pas.
    Tu as oublié un return 0 et aussi de déclarer i.
    De plus studio.h n'existe pas

    Je pense que ton erreur vient de cette ligne :
    Ici tu déclare un tableau de char d'un char.

    Il faut faire :

  5. #5
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    oui j'ai dû me tromper quand j'ai rédigé sur le forum, mais sinon ce n'est pas ça le problème, mon code compile bien et même marche parfaitement sous linux \o/

    pour tmp j'avais mis char tmp[]="00"; il se débrouille après. mais le problème ne vient pas de ça ni des remarques que tu m'as faites.

    Merci qd même =) essayes un debug pour voir -si tu peux bien sûr- c'est le sprintf qui foire :S

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Je suis aussi sous Linux.
    Peut-être que c'est le format hx qui n'est pas reconnu sous windows?
    Pourrais-tu nous montrer ce que donne le sprintf ?

  7. #7
    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 comportement du programme est indéterminé et si il marche super bien sous Linux, c'est un malheureux hasard :
    Le strcat() dans bytesToString() suppose que le paramètre string est une chaine de caractères (vide ou non). Un simple tableau ne suffit pas.
    Or, lors de l'appel, l'argument correspondant, le tableau str, est local donc non initialisé et contient n'importe quoi.
    Il faut l'initialiser par char str[2*4+1]=""; .

  8. #8
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Citation Envoyé par diogene Voir le message
    Le comportement du programme est indéterminé et si il marche super bien sous Linux, c'est un malheureux hasard :
    Le strcat() dans bytesToString() suppose que le paramètre string est une chaine de caractères (vide ou non). Un simple tableau ne suffit pas.
    Or, lors de l'appel, l'argument correspondant, le tableau str, est local donc non initialisé et contient n'importe quoi.
    Il faut l'initialiser par char str[2*4+1]=""; .
    Merci, ça marche maintenant

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

Discussions similaires

  1. [UBUNTU] Problème au niveau du partitionnement
    Par Louis-Guillaume Morand dans le forum Ubuntu
    Réponses: 19
    Dernier message: 19/07/2006, 18h05
  2. [CSS] Problème au niveau de la résolution
    Par shukin dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/10/2005, 13h29
  3. [PPC][C#][SQL2000] Problème au niveau de donné controlé
    Par Roach dans le forum Windows Forms
    Réponses: 16
    Dernier message: 21/09/2005, 22h08
  4. problème au niveau de restore database
    Par Redouane dans le forum Administration
    Réponses: 2
    Dernier message: 07/09/2005, 11h49
  5. [DNS MX]Avec DynDNS.org, problème au niveau du MX
    Par Swoög dans le forum Développement
    Réponses: 9
    Dernier message: 24/08/2004, 22h00

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