Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retourner un double avec la fonction strtod

Imcompréhension des instruction

Sujet résolu
    22 mars 2023 à 16:57:43

    Bonjour

    Dans le dernier chapitre du cours suivant https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16993-securisez-la-saisie-de-texte#/id/r-2190666 je ne comprend pas les instructions données: 

    Ensuite, modifiez votre fonction lireDouble pour qu'elle accepte aussi le symbole virgule comme séparateur décimal :

    1. Remplacez la virgule par un point dans la chaîne de texte lue (grâce à la fonction de recherche strchr).

    2. Puis envoyez la chaîne modifiée à strtod.

    On est censé modifier je pense, le code suivant de sorte à retourner un double et pouvoir écrire des décimaux dans la console:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> 
    void viderBuffer()
    {
        int c = 0;
        while (c != '\n' && c != EOF)
        {
            c = getchar();
        }
    }
    
    int lire(char *chaine, int longueur)
    {
        char *positionEntree = NULL;
    
        if (fgets(chaine, longueur, stdin) != NULL)
        {
            positionEntree = strchr(chaine, '\n');
            if (positionEntree != NULL)
            {
                *positionEntree = '\0';
            }
            else
            {
                viderBuffer();
            }
            return 1;
        }
        else
        {
            viderBuffer();
            return 0;
        }
    }
    
    long lireLong()
    {
        char nombreTexte[100] = {0}; // 100 cases devraient suffire
    
        if (lire(nombreTexte, 100))
        {
            // Si lecture du texte ok, convertir le nombre en long et le retourner
            return strtol(nombreTexte, NULL, 10);
        }
        else
        {
            // Si problème de lecture, renvoyer 0
            return 0;
        }
    }
    
    int main(int argc, char *argv[])
    {
        long age = 0;
    
        printf("Quel est votre age ? ");
        age = lireLong();
        printf("Ah ! Vous avez donc %d ans !\n\n", age);
    
        return 0;
    }

    Voici comment j'ai essayer de modifier le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> 
    void viderBuffer()
    {
        int c = 0;
        while (c != '\n' && c != EOF)
        {
            c = getchar();
        }
    }
    
    int lire(char *chaine, int longueur)
    {
        char *positionEntree = NULL;
    
        if (fgets(chaine, longueur, stdin) != NULL)
        {
            positionEntree = strchr(chaine, '\n');
            if (positionEntree != NULL)
            {
                *positionEntree = '\0';
            }
            else
            {
                viderBuffer();
            }
            return 1;
        }
        else
        {
            viderBuffer();
            return 0;
        }
    }
    
    long lireDouble()
    {
        char nombreTexte[100] = {0}; // 100 cases devraient suffire
    
        if (lire(nombreTexte, 100))
        {
            
            return strtod(nombreTexte, NULL);
        }
        else
        {
            // Si problème de lecture, renvoyer 0
            return 0;
        }
    }
    
    int main(int argc, char *argv[])
    {
        long age = 0;
    
        printf("Quel est votre age ? ");
        age = lireDouble();
        printf("Ah ! Vous avez donc %d ans !\n\n", age);
    
        return 0;
    }

    Mais je ne comprend pas de quelle virgule qui doit être remplacée par un point les instructions parlent et que le code que j'ai modifier refuse d'afficher des décimaux dans la console. Quelqu'un comprendrait-il comment le code doit-être modifié afin de pouvoir afficher des décimaux en console ?

    Cordialement


    -
    Edité par 1Stark 27 mars 2023 à 19:13:31

    • Partager sur Facebook
    • Partager sur Twitter
      22 mars 2023 à 17:36:43

      1Stark a écrit:

      Mais je ne comprend pas de quelle virgule qui doit être remplacée par un point les instructions parlent

      Le séparateur des décimale pour les nombres à virgule c'est le point or si le gars tape une virgule, il faut la remplacer par un point.

      1Stark a écrit:

      et que le code que j'ai modifier refuse d'afficher des décimaux dans la console. Quelqu'un comprendrait-il comment le code doit-être modifié afin de pouvoir afficher des décimaux en console ?

      Ta fonction lireDouble devrait retourner un double, or elle retourne un long ?!

      Et ta variable age devrait être un double.

      (entre parenthèses pour afficher un long on utilise le descripteur %ld).

      -
      Edité par rouIoude 22 mars 2023 à 17:39:04

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        22 mars 2023 à 19:41:20

        rouIoude a écrit:

        Ta fonction lireDouble devrait retourner un double, or elle retourne un long ?!

        Et ta variable age devrait être un double.

        Les copiés-collés posent souvent ce genre de problème  

        -
        Edité par edgarjacobs 22 mars 2023 à 19:43:50

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          22 mars 2023 à 23:10:50

          @1Stark:
          Tu as utilisé strchr() pour remplacer le '\n' par un '\0'.
          Tu pourrais peut-être l'utiliser pour remplacer la ',' par un '.' ...
          Et du même coup vérifier qu'il n'y a pas plus d'une seule virgule.

          Attention aux petits malins qui mettraient à la fois une virgule et un point ...

          -
          Edité par PierrotLeFou 22 mars 2023 à 23:15:16

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            27 mars 2023 à 20:15:24

            Bonsoir

            J'ai enlevé le commentaire qui prête à confusion dans la fonction lireDouble(), j'ai attribuer à la variable "age" le type double, puis après avoir tenté les suggestions sans obtenir le résultat voulu, j'ai tenté de changer le "%d" par un "%f" et le code à bien accepté le point en console mais n'affiche que des zéros après ce point:

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h> // Penser à inclure string.h pour strchr()
            #include <ctype.h>
            
            void viderBuffer()
            {
                int c = 0;
                while (c != '\n' && c != EOF)
                {
                    c = getchar();
                }
            }
            
            int lire(char *chaine, int longueur)
            {
                char *positionEntree = NULL;
            
                if (fgets(chaine, longueur, stdin) != NULL)
                {
                    positionEntree = strchr(chaine, '\n');
                    if (positionEntree != NULL)
                    {
                        *positionEntree = '\0';
                    }
                    else
                    {
                        viderBuffer();
                    }
                    return 1;
                }
                else
                {
                    viderBuffer();
                    return 0;
                }
            }
            
            long lireDouble()
            {
                char nombreTexte[100] = {0}; // 100 cases devraient suffire
            
                if (lire(nombreTexte, 100))
                {
            
                    return strtod(nombreTexte, NULL);
                }
                else
                {
                    // Si problème de lecture, renvoyer 0
                    return 0;
                }
            }
            
            int main(int argc, char *argv[])
            {
                double age = 0;
            
                printf("Quel est votre age ? ");
                age = lireDouble();
                printf("Ah ! Vous avez donc %f ans !\n\n", age);
            
                return 0;
            }
            

            @PierrotLeFou: 

            apparemment le code remplace déjà automatiquement les virgules par des points et supprime les points en trop: J'ai essayé de taper "56.,456" et la console m'a affiché:

            Quel est votre age ? 56.,456

            Ah ! Vous avez donc 56.000000 ans !

            Mais je n'arrive pas à afficher par exemple "56.400000" lorsque j'écris 56.4

            Cordialement

            • Partager sur Facebook
            • Partager sur Twitter
              27 mars 2023 à 20:36:30

              Salut,

              Je ne comprends pas pourquoi tu veux écrire ton âge avec à la fois une virgule et un point! Habituellement on utilise la virgule.

              On peut "expliquer" à la fonction strtod() comment lire les nombres écrits par des Français; mais le cours de propose de faire autrement. Tu dois transformer le nombre saisi (en France donc qui utilise la virgule), en un nombre compris par la fonction strtod() qui considère que le séparateur décimal est un point (à l'anglaise).
              C'est ce qui t'as déjà été dit:

              rouloude a écrit:

              1Stark a écrit:

              Mais je ne comprend pas de quelle virgule qui doit être remplacée par un point les instructions parlent

              Le séparateur des décimale pour les nombres à virgule c'est le point or si le gars tape une virgule, il faut la remplacer par un point.

              PierrotLeFou a écrit:

              @1Stark:
              Tu as utilisé strchr() pour remplacer le '\n' par un '\0'.
              Tu pourrais peut-être l'utiliser pour remplacer la ',' par un '.' ...
              Et du même coup vérifier qu'il n'y a pas plus d'une seule virgule.

              J'ajoute que la fonction strchr() qui peut remplacer la virgule par un point doit être utilisée à la ligne 45.

              • Partager sur Facebook
              • Partager sur Twitter

              En recherche d'emploi.

                28 mars 2023 à 0:18:42

                1Stark a écrit:

                Mais je n'arrive pas à afficher par exemple "56.400000" lorsque j'écris 56.4

                Parce que lireDouble() renvoie un long....

                Edit: lis-tu les réponses qui te sont données ?

                rouIoude a écrit:

                Ta fonction lireDouble devrait retourner un double, or elle retourne un long ?!






                -
                Edité par edgarjacobs 28 mars 2023 à 0:36:51

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  29 mars 2023 à 18:11:47

                  Bonjour

                  @edgarjacobs J'étais persuadé d'avoir changé le type que ma fonction renvoie. Le code fonctionne à présent comme voulu:

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <string.h> // Penser à inclure string.h pour strchr()
                  #include <ctype.h>
                  
                  void viderBuffer()
                  {
                      int c = 0;
                      while (c != '\n' && c != EOF)
                      {
                          c = getchar();
                      }
                  }
                  
                  int lire(char *chaine, int longueur)
                  {
                      char *positionEntree = NULL;
                  
                      if (fgets(chaine, longueur, stdin) != NULL)
                      {
                          positionEntree = strchr(chaine, '\n');
                          if (positionEntree != NULL)
                          {
                              *positionEntree = '\0';
                          }
                          else
                          {
                              viderBuffer();
                          }
                          return 1;
                      }
                      else
                      {
                          viderBuffer();
                          return 0;
                      }
                  }
                  
                  double lireDouble()
                  {
                      char nombreTexte[100] = {0}; // 100 cases devraient suffire
                  
                      if (lire(nombreTexte, 100))
                      {
                  
                          return strtod(nombreTexte, NULL);
                      }
                      else
                      {
                          // Si problème de lecture, renvoyer 0
                          return 0;
                      }
                  }
                  
                  int main(int argc, char *argv[])
                  {
                      double age = 0;
                  
                      printf("Quel est votre age ? ");
                      age = lireDouble();
                      printf("Ah ! Vous avez donc %f ans !\n\n", age);
                  
                      return 0;
                  }
                  

                  @Dalfab Je n'essayais pas d'afficher l'age avec à la fois un point et une virgule: On m'a suggéré de placer une sécurité dans le code contre une éventuelle fois ou l'on placerait à la fois un point et une virgule puis j'ai fait part de mes observations.

                  Après avoir changé le type de la fonction j'ai changé comme suggéré le "\n" par un "," et le "\0" par un "." ce qui me donne le code suivant qui remplace bien les virgules par des points:

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <string.h> // Penser à inclure string.h pour strchr()
                  #include <ctype.h>
                  
                  void viderBuffer()
                  {
                      int c = 0;
                      while (c != '\n' && c != EOF)
                      {
                          c = getchar();
                      }
                  }
                  
                  int lire(char *chaine, int longueur)
                  {
                      char *positionEntree = NULL;
                  
                      if (fgets(chaine, longueur, stdin) != NULL)
                      {
                          //positionEntree = strchr(chaine, '\n');
                          positionEntree = strchr(chaine, ',');
                          if (positionEntree != NULL)
                          {
                              //*positionEntree = '\0';
                              *positionEntree = '.';
                          }
                          else
                          {
                              viderBuffer();
                          }
                          return 1;
                      }
                      else
                      {
                          viderBuffer();
                          return 0;
                      }
                  }
                  
                  double lireDouble()
                  {
                      char nombreTexte[100] = {0}; // 100 cases devraient suffire
                  
                      if (lire(nombreTexte, 100))
                      {
                  
                          return strtod(nombreTexte, NULL);
                      }
                      else
                      {
                          // Si problème de lecture, renvoyer 0
                          return 0;
                      }
                  }
                  
                  int main(int argc, char *argv[])
                  {
                      double age = 0;
                  
                      printf("Quel est votre age ? ");
                      age = lireDouble();
                      printf("Ah ! Vous avez donc %f ans !\n\n", age);
                  
                      return 0;
                  }
                  

                  Merci à tous.

                  Cordialement

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Retourner un double avec la fonction strtod

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown