Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire accepter la "," à strtod

    15 juin 2021 à 18:17:50

    Bonjour,

    Je termine le chapitre 10 de la partie "Techniques avancées du C" sur la saisie de texte sécurisée. A la fin de ce chapitre il nous est demandé d'écrire une fonction "lireDouble" qui utilise la fonction "strtod" pour renvoyer un double depuis un texte saisi par un utilisateur (de manière "sécurisée" avec un fgets).

    Voici ce que j'ai fait :

    Mon main :

    int main(int argc, char *argv[])
    {
        // On cree un tableau de TAILLE_MAX caractères + 1 pour le \0
        char nom[TAILLE_MAX + 1];
        long age = 0;
        double poids = 0;
     
        printf("\nQuel est votre nom ? ");
        //On utilise notre fonction "lire" pour récupérer la saisie
        lire(nom, TAILLE_MAX + 1);
        printf("Ah ! Vous vous appelez donc %s !\n\n", nom);
    
        printf("Quel est votre age ? ");
        age = lireLong();
        printf("Ah ! Vous avez donc %ld ans !\n\n", age);
    
        printf("Combien pesez-vous ? ");
        poids = lireDouble();
        printf("Ok ! Vous pesez donc %f kg !\n\n", poids);
     
        return 0;
    }

    Ma fonction lireDouble :

    double lireDouble()
    {
        char doubleDansTexte[TAILLE_MAX] = {0}; 
        int i = 0;
    
        if (lire(doubleDansTexte, TAILLE_MAX))
        {
            return strtod(doubleDansTexte, NULL);
        }
    
        else
        {
            // Si problème de lecture, renvoyer 0
            return 0;
        }
    }

    (Ca fonctionne, rien de très compliqué, surtout que cette fonction est basée sur le même principe qu'une fonction "lireLong" proposée un peu plus haut dans le cours)


    On nous fait ensuite remarquer que "strtod" pend en compte le "point" décimal mais qu'elle ne connaît pas la virgule. Puis on nous demande de réécrire "lireDouble" de façon à ce qu'elle accepte aussi le symbole "," comme séparateur décimal. Pour cela je cite : " La technique est simple : remplacez la virgule par un point dans la chaîne de texte lue (grâce à la fonction de recherche "strchr"), puis envoyez la chaîne modifiée à "strtod" "

    Voici ce que j'ai fait : 

    double lireDouble()
    {
        char doubleDansTexte[TAILLE_MAX] = {0}; 
        int i = 0;
    
        // Si il n'y a pas d'erreur de saisie
        if (lire(doubleDansTexte, TAILLE_MAX))
        {
            // On parcourt "doubleDansTexte" jusqu'à "\0"
            for (i = 0 ; doubleDansTexte[i] != '\0' ; i++)
            {
                // Si un "." se trouve dans "doubleDansTexte""
                if (doubleDansTexte[i] == '.') 
                {
                    // On met "," dans la case du tableau "doubleDansTexte" correspondant à la case qui contenait "."
                    doubleDansTexte[i] = ','; 
                }
            }
    
            // Si la lecture du texte ok, convertir le "nombreDansTexte" en long et le retourner
            return strtod(doubleDansTexte, NULL);
        }
    
        else
        {
            // Si problème de lecture, renvoyer 0
            return 0;
        }
    }


    J'ai essayé de suivre les consignes mais voila ce que j'obtiens en console si je tape une virgule :

    Quel est votre nom ? Lucas
    Ah ! Vous vous appelez donc Lucas !
    
    Quel est votre age ? 28
    Ah ! Vous avez donc 28 ans !
    
    Combien pesez-vous ? 80,5   
    Ok ! Vous pesez donc 80.000000 kg !


    Je me demande si l'erreur vient du fait que l'on remplace le point par une virgule et que l'on envoie cela à "strod" qui, de toute façon, n'accepte pas les virgules (ce qui voudrait dire que la consigne n'est pas bonne ou plutôt que je l'ai mal comprise ?)  ?Ou peut être que c'est simplement ma façon de faire qui n'est pas exacte ?


    Merci d'avance pour votre aide :)


    -
    Edité par LucasLethuillier 15 juin 2021 à 18:20:27

    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2021 à 18:26:04

      Bonjour,

      dans ce que tu nous raconte :

      LucasLethuillier a écrit:

      [...]
      Pour cela je cite : " La technique est simple : remplacez la virgule par un point dans la chaîne de texte lue (grâce à la fonction de recherche "strchr"), puis envoyez la chaîne modifiée à "strtod" "

      dans ton code on trouve (en ne gardant que les commentaires) :

      // On parcourt "doubleDansTexte" jusqu'à "\0"
                  // Si un "." se trouve dans "doubleDansTexte""
                      // On met "," dans la case du tableau "doubleDansTexte" 

      Donc si on trouve un "." on met une "," à la place …

      Je sens comme des signaux contradictoires …

      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2021 à 19:03:32

        Quel naze :-° Je fatigue à force de manger du C à longueur de journée... J'ai peur du moment où ca va se compliquer sérieusement :lol: La prochaine fois j'attendrai le matin suivant avant de poster un message ici !

        Merci ! Il fallait juste inverser le . et la , ..

        // On parcourt "doubleDansTexte" pour vérifier si une "," s'y trouve 
                for (i = 0 ; doubleDansTexte[i] != '\0' ; i++)
                {
                    // Si "," se trouve dans "doubleDansTexte""
                    if (doubleDansTexte[i] == ',') 
                    {
                        // On met "." dans la case du tableau "doubleDansTexte" correspondant à la case qui contenait ","
                        doubleDansTexte[i] = '.'; 
                    }
                }



        -
        Edité par LucasLethuillier 15 juin 2021 à 19:09:41

        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2021 à 20:38:09

          Bonjour,

          En fait strtod() sait très bien décoder la virgule. A condition d'utiliser la bonne locale.

          setlocale( LC_NUMERIC, "" );  // gérer les nombres au format local
          double  d = strtod( "3,14", nullptr );  // donne bien 3.14
          

          Mais ça n'est pas thread safe, c'est donc plutôt à éviter.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            16 juin 2021 à 10:05:30

            Bonjour,

            Merci pour la précision, c'est toujours bon à savoir ;)

            -
            Edité par LucasLethuillier 16 juin 2021 à 10:05:52

            • Partager sur Facebook
            • Partager sur Twitter

            Faire accepter la "," à 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