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 :

Lecture d'un double avec sscanf


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Lecture d'un double avec sscanf
    Bonjour,

    Je développe en C++ et pour des besoins de portabilité je dois compiler mes sources C++ sur MacOS (je travaille habituellement sur une machine linux 64).
    Je rencontre un problème lors de la lecture d'une chaîne de caractères représentant un double : lire "5.0" ou "5." est identique sous linux, mais sur Mac "5." est reconnu comme étant un nombre et un caractère.
    Voici un exemple simple pour illustrer le problème :
    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
    24
    25
    26
     
    #include <iostream>
    using namespace std;
     
    void read_val(double*, char*);
     
    int main()
    {
      double val = 0.;
      char word[20] = "5.";
     
      cout << "word = [" << word << "]" << endl;
      read_val(&val, word);
     
      return 0;
    }
     
    void read_val(double *value, char* word)
    {
      char tmp_char[1];
     
      int ret = sscanf (word,"%lg %c",value, tmp_char);
      cout << "val = " << value[0] << endl;
      cout << "tmp = " << tmp_char << endl;
      cout << "ret = " << ret << endl;
    }
    Je compile sur linux avec gcc3.4.6 et sur Mac avec gcc4.7.2 (64bits).
    Si quelqu'un trouve une erreur quelque part, ou a une explication à donner, je suis preneuse !

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu commences par faire un test de printf("%f\n", 5.0), les deux t'affichent-ils bien "5.0", ou bien l'un affiche-t-il une virgule à la place du point?

    Edit: %f au lieu de %d, bien sûr.
    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.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    Alors j'ai plutôt mis %g, et les deux m'affichent "5".
    Avec %f, les deux m'affichent "5.000000" avec un point.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Alors, ce n'est pas un problème de locale (et puis, j'avais mal lu ton premier message, j'ai l'impression).
    Je me demande ce que la norme dit sur scanf()...
    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.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    et en C++ non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float data;
    std::cin>>data;
    std::cout<<data;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    En fait sur Mac j'ai cru comprendre en lisant quelques docs sur les fonctions d'édition comme printf(), que les doubles ne contiennent un point que si celui-ci est suivi par un digit, c'est-à-dire que :
    * pour "5.1" le code lira et affichera "5.1"
    * pour "5." le code ne lira et n'affichera que "5" car il n'y a rien derrière le point.

    Dans mon code je n'utilise pas de atof() ou std::cin >> data car le but de l'utilisation de sscanf() est de détecter si le nombre écrit ne contient pas un caractère anormal, issu d'une faute de frappe par exemple.

    Donc du coup je ne trouve pas d'autre solution que de faire une sale boucle sur le mot lu...

Discussions similaires

  1. lecture d'un tableau uint8_t avec sscanf
    Par Mokhtar BEN MESSAOUD dans le forum Débuter
    Réponses: 8
    Dernier message: 15/04/2008, 18h55
  2. Lire une ligne de caractères et de doubles avec sscanf
    Par colinou dans le forum Débuter
    Réponses: 4
    Dernier message: 16/03/2008, 20h46
  3. Réponses: 2
    Dernier message: 10/08/2005, 09h46
  4. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  5. Réponses: 4
    Dernier message: 12/09/2003, 11h38

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