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 :

probleme saisi float


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut probleme saisi float
    bonjour a tous,

    voila, je suis entrain de faire une fonction de saisi de float.

    voici son code :
    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
    float readFloat()
    {
       float temp;
       char *sChaine,*sDebChaine;
       Booleen a;
       sChaine			=	(char *)malloc(10*sizeof(char));
       do
       {
           fflush(stdin);
           fgets (sChaine,10, stdin);
           sDebChaine  = sChaine;
           a           = VRAI;
           while( (*sChaine!='\0') )
           {
               if( (*sChaine>'9') && (*sChaine!='.') )
                   a = FAUX;
               sChaine++;
           }
           if( a==FAUX ) {
               printf("ERREUR, veuillez recommencer : ");
               sChaine = sDebChaine;
           }
       } while(a==FAUX);
        temp = strtof (sChaine,NULL);
        free(sDebChaine);
        return temp;
    }
    le seul probleme, c'est quelle me renvoit toujours 0, donc que la conversion au niveau de strtof se passe mal alors que la chaine saisit est un reel,
    quelqu'un aurait une petite idée?

  2. #2
    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
    Quelques remarques :

    - strtof n'est que disponible en C99, utilise strtod avec des doubles à la place...
    - on ne cast pas le retour de malloc
    - faire ta boucle interne montre que tu n'as pas compris ou ne sais pas utiliser strtof(d) correctement...
    - on ne fait pas de fflush sur un flux entrant

    Bien que je ne vois pas comment ce test va vraiment t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               if( (*sChaine>'9') && (*sChaine!='.') )
    Je suis sûr qu'on arriverait à faire planter ton programme...

    Une meilleure solution (mais pas encore parfaite) :

    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
     
    double readDouble()
    {
       double temp;
       char sChaine[128],*sFinChaine;
     
     
       do
       {
           printf("Veuillez entrer un nombre : ");
           fgets (sChaine,sizeof(sChaine), stdin);
     
           temp = strtod(sChaine,&sFinChaine);
       } while((sChaine==sDebChaine)||((*sFinChaine!='\n')&&(*sFinChaine!='\0')));
     
        return temp;
    }
    Jc

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Salut !

    Ton programme ne pouvais pas marcher, vu que dans la boucle, tu lis tous les caractères de ta chaine schaine et tu fais "avancer" le pointeur : schaine++.
    Donc apres la boucle, tu convertis dans temp une chaine qui vaut NULL, donc tu as temp=0.
    Si vraiment tu veux garder ta méthode, il faudrait que tu copie ta chaine avant le while ( strcpy(sInit, sChaine) ) et à la sortie tu convertis sInit en float ( temp=strtof(sInit) ).

    Maintenant, je suis d'accord avec fearyourself il y a plus simple pour faire une saisie de float...

  4. #4
    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 violette327
    Salut !
    Ton programme ne pouvais pas marcher, vu que dans la boucle, tu lis tous les caractères de ta chaine schaine et tu fais "avancer" le pointeur : schaine++.
    Donc apres la boucle, tu convertis dans temp une chaine qui vaut NULL, donc tu as temp=0.
    Si vraiment tu veux garder ta méthode, il faudrait que tu copie ta chaine avant le while ( strcpy(sInit, sChaine) ) et à la sortie tu convertis sInit en float ( temp=strtof(sInit) ).
    Ou juste faire

    Jc

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    ok je viens de tester la methode de fearyourself, mais j'ai toujours 0 dans temp.

    est ce que cela pourrais venir de mon compilo : j'utilise dev c++ ?

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dude666
    ok je viens de tester la methode de fearyourself, mais j'ai toujours 0 dans temp.
    Comment tu le sais ?

    Je parie pour un bug d'affichage (printf()).

    Ceci fonctionne :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    double readDouble (void)
    {
       double temp;
       char sChaine[128], *sFinChaine;
       do
       {
          printf ("Veuillez entrer un nombre : ");
          fflush (stdout);
          fgets (sChaine, sizeof sChaine, stdin);
          temp = strtod (sChaine, &sFinChaine);
       }
       while ((sFinChaine == sChaine)
              || ((*sFinChaine != '\n') && (*sFinChaine != '\0')));
       return temp;
    }
     
     
    int main ()
    {
       double n = readDouble ();
     
       printf ("n = %f\n", n);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Veuillez entrer un nombre : 12,34
    Veuillez entrer un nombre : 12a
    Veuillez entrer un nombre : a12
    Veuillez entrer un nombre : 12.34
    n = 12.340000
     
    Press ENTER to continue.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par fearyourself
    Une meilleure solution (mais pas encore parfaite) :
    Il faut aussi tester si errno est différent de ERANGE.

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

Discussions similaires

  1. Probleme saisie et table
    Par haydens dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 25/02/2009, 17h11
  2. probleme de float
    Par hamster. dans le forum Général Java
    Réponses: 2
    Dernier message: 03/01/2008, 13h53
  3. [MySQL] Probleme saisie données formulaire
    Par ZeLaatar dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/12/2007, 12h26
  4. probleme avec float et GetDlgItemText
    Par nanettemontp dans le forum Windows
    Réponses: 2
    Dernier message: 02/10/2007, 08h42
  5. Problème avec float sous Mysql
    Par adgabd dans le forum Bases de données
    Réponses: 1
    Dernier message: 22/09/2006, 10h52

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