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 :

à propos du retour de strtod()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut à propos du retour de strtod()
    Bonjour, je suis en train de faire une fonction qui lit un fichier texte. En gros, à chaque ligne j'ai un mot-clé et une valeur associée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TEMP 20.3
    PRES 2.9
    Donc avec fgets() et strtod() ou strtol() j'arrive à récupérer toutes mes valeurs. Mais je pense que strtod() (ou strtol()) ne suffisent pas car il faut avant tout que je contrôle ma chaine de caractères (renvoyée par fgets()). Si je fais la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      double d1, d2, d3;
      d1 = strtod("2.6",NULL);
      printf("d1 = %f\n",d1);
      d2 = strtod("2.6.1",NULL);
      printf("d2 = %f\n",d2);
      d3 = strtod("XXX",NULL);
      printf("d3 = %f\n",d3);
    j'ai comme sortie :

    d1 = 2.600000
    d2 = 2.600000
    d3 = 0.000000
    ce n'est pas "normal". Comment puis-je m'assurer que d2 et d3 sont en fait faux (et devraient renvoyer une erreur) ? Il faudrait faire une fonction à côté qui analyse la chaine de caractères passée à strtod() (et strtol()) et qui fasse :
    1) qui regarde si tous les caractères sont soit un chiffre, soit un point, soit un signe "-"
    2) qui vérifie qu'il y a au maximum un seul point (2.6 et non 2.6.1)
    3) qui vérifie qu'il y a au maximum un seul signe "-" et que ce dernier s'il existe est en 1e position (-2.6 et non 2-.6 par exemple)

    Mais je pense que scanf fait tout ce boulot non ? Il faut "juste" que je vérifie la valeur de retour de cette fonction.

    Qu'en pensez-vous ?

    Merci de vos remarques

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    A quoi sert le deuxieme parametre de strtod a ton avis?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    A quoi sert le deuxieme parametre de strtod a ton avis?
    Salut, effectivement, je n'avais pas pensé au 2e argument. J'ai fait le test suivant :

    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
    27
    28
     
      double d1, d2, d3, d4, d5;
      char * p1 = "2.6", * p2 = "2.6.1", * p3 = "XXX", * p4 = "2.7  8.9", * p5 = "2.7.1  8.9";
     
      d1 = strtod(p1,&p1);
      printf("d1 = %f\n",d1);
      printf("p1 = %s\n",p1);
      if(*p1 == '\0') puts("OK");
     
      d2 = strtod(p2,&p2);
      printf("d2 = %f\n",d2);
      printf("p2 = %s\n",p2);
      if(*p2 == '\0') puts("OK");
     
      d3 = strtod(p3,&p3);
      printf("d3 = %f\n",d3);
      printf("p3 = %s\n",p3);
      if(*p3 == '\0') puts("OK");
     
      d4 = strtod(p4,&p4);
      printf("d4 = %f\n",d4);
      printf("p4 = %s\n",p4);
      if(*p4 == '\0') puts("OK");
     
      d5 = strtod(p5,&p5);
      printf("d5 = %f\n",d5);
      printf("p5 = %s\n",p5);
      if(*p5 == '\0') puts("OK")
    et la sortie est

    d1 = 2.600000
    p1 =
    OK
    d2 = 2.600000
    p2 = .1
    d3 = 0.000000
    p3 = XXX
    d4 = 2.700000
    p4 = 8.9
    d5 = 2.700000
    p5 = .1 8.9
    concernant d4 et d5 (ou bien p4 et p5), comment savoir si j'ai une erreur. Pour p5, on voit que je peux très bien avoir 3 nombres (et non 2 comme je l'ai mis)

    Je n'arrive pas à voir le test qu'il faut que je fasse sur le 2e argument car les tests

    2e argument == NULL ou
    2e argument == '\0'

    ne suffisent pas (je crois...)

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Il faut que tu definisses quels sont les caracteres que tu consideres comme acceptables immediatement apres le nombre (est-ce qu'un ; colle au nombre, c'est bon par exemple).

    Le test doit etre quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p != d && peutEtreApresUnNombre(*p)
    p != d est necessaire pour une chaine vide ou ne contenant que des espaces.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Mais ce n'est pas plus simple d'utiliser scanf ? On regarde la valeur retournée par scanf ?

    L'inconvénient : on doit connaitre le nombre de valeurs à lire...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    OK, c'est bon ça marche, j'ai bien fait ton test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    d = strtod(p,&p);
    if(*p != '\0') erreur
    Merci

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. A propos des fonctions et des valeurs de retour
    Par emprex dans le forum Débuter
    Réponses: 8
    Dernier message: 14/12/2007, 16h11
  3. Retour chariot dans un TMemo ?
    Par Vincent PETIT dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/08/2002, 18h55
  4. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18
  5. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47

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