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 :

la fonction atof() de la biblio <stdlib.h> :


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Par défaut la fonction atof() de la biblio <stdlib.h> :
    Bonjour les amis .. Je suis un nouveau membre dans votre Forum ..
    j'ai un petit problème concernant la fonction atof() de la bibliothèque <stdlib.h> .. qui convertit une chaine de caractère en un double ..
    les fonctions atoi() , atol() marchent tres bien ..
    mais celle ci ( atof() ) ne marche pas .. quand j'entre un chaine de caractere par exemple 123.123marcosa elle retourne 0.00000 normalement ca doit être 123.123 ..
    voici le photo du petit problème : Nom : probleme.png
Affichages : 1198
Taille : 22,3 Ko
    et merci (y) ;

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MouadCR7 Voir le message
    Bonjour les amis .. Je suis un nouveau membre dans votre Forum ..
    Bonjour Mouad
    Citation Envoyé par MouadCR7 Voir le message
    j'ai un petit problème concernant la fonction atof() de la bibliothèque <stdlib.h> .. qui convertit une chaine de caractère en un double ..
    mais celle ci ( atof() ) ne marche pas .. quand j'entre un chaine de caractere par exemple 123.123marcosa elle retourne 0.00000 normalement ca doit être 123.123 ..
    Rajoute #include <stdlib.h> qui contient le prototype de atof() (en plus tu la connais puisque tu en parles dans ton titre !!!). Sans ce prototype, le compilateur qui la voit pour la première fois dans ton code la qualifie en "int" (comme toute fonction non déclarée). Ensuite quand le float renvoyé par la fonction est casté en int, il passe à 0.

    Accessoirement il vaut mieux éviter d'utiliser gets() non sécurisée (ton compilateur as dû te le dire). Bon là ça va que c'est un petit truc rapide pour tester mais à l'avenir, si tu veux coder des trucs plus robustes, il vaudra mieux lui préférer fgets(str, 100, stdin) (100 parce que ta chaine est taillée à 100 bien évidemment). Et pareil, vaut mieux éviter le "tout majuscule" pour les noms de variables car c'est réservé aux macros.

    Citation Envoyé par MouadCR7 Voir le message
    voici le photo du petit problème
    Ben la prochaine fois tu mettras ton code directement dans ton post entre balises ce qui nous permettra de le récupérer sans avoir à le retaper.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour Mouad

    Rajoute #include <stdlib.h> qui contient le prototype de atof() (en plus tu la connais puisque tu en parles dans ton titre !!!). Sans ce prototype, le compilateur qui la voit pour la première fois dans ton code la qualifie en "int" (comme toute fonction non déclarée). Ensuite quand le float renvoyé par la fonction est casté en int, il passe à 0.

    Accessoirement il vaut mieux éviter d'utiliser gets() non sécurisée (ton compilateur as dû te le dire). Bon là ça va que c'est un petit truc rapide pour tester mais à l'avenir, si tu veux coder des trucs plus robustes, il vaudra mieux lui préférer fgets(str, 100, stdin) (100 parce que ta chaine est taillée à 100 bien évidemment). Et pareil, vaut mieux éviter le "tout majuscule" pour les noms de variables car c'est réservé aux macros.


    Ben la prochaine fois tu mettras ton code directement dans ton post entre balises ce qui nous permettra de le récupérer sans avoir à le retaper.
    ouuuupss xD grosse faute d'inattention , je me suis concentre sur les autres lignes , mais la question qui se pose pourquoi le compilateur l'a accepte , normalement ca aucun sens , et pourquoi il a accepte les autres fonctions sans <stdlib.h> ?
    a propos de la fct gets , mon compilateur n'a pas mentionne aucune chose .. je vais essayer de lire le cours de ces nouveaux fonctions que je ne les connait pas ..

  4. #4
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir et bienvenue, l'erreur est due aux "marcosa" après les valeurs numérique saisie.
    Si vous regardez attentivement le résultat que vous avez obtenu vous remarquerez que les fonctions atoi atol et atof acceptent uniquement les valeurs numériques, mais en revanche n'acceptent pas les valeurs non-numériques comme "azert123.123azerty". La chaîne de caractères qui vient après ou avants une série de valeurs ne peut donc être converties; d'où, le renvoi de la valeur zéro par ces fonctions.
    Il est à noter également qu'il y a aucun moyen de savoir si la conversion a échoué. Soit vous saisissez uniquement des valeurs numériques du genre : 12345.12345, 12345.12345E+03 ou -12345.12345E-05, ou alors vous optez pour une alternative comme sscanf ou de la technicité avec les fonctions comme strtol() et strtoul() ( qui sont utilise par sscanf ) .

    Il est également préférable que vous utilisiez la fonction fgets que gets pour des questions de sécurité, car, la fonction gets() ne vérifie pas la limite maximale des caractères d'entrée cela a pour conséquence un dépassement du tampon et écrasement d'autres informations; tant dis qu'avec fgets on s'arrêtera lorsque l'on atteints la limite fixé (n-1) qui est la taille du buffer/ tampon. Ainsi, si la chaîne lue est plus longue que le tampon de réception, aucun dépassement de mémoire ne sera effectué.
    À bientôt,

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    l'erreur est due aux "marcosa" après les valeurs numérique saisie.
    Non.
    Si c'était la cause du souci, alors ça ne fonctionnerait pas non plus pour atoi() et atol(). Or, si tu regardes bien son image, on voit que ça fonctionne.

    Citation Envoyé par sambia39 Voir le message
    comme "azert123.123azerty"
    Il n'a pas entré "azert123.123azerty" mais "123.123marcosa" et là c'est bon car la fonction s'arrêtera au premier caractère non numérique et renverra 123.123.

    Citation Envoyé par sambia39 Voir le message
    d'où, le renvoi de la valeur zéro par ces fonctions.
    Non
    Elles renverront le maximum de ce qu'elles auront pu traiter.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben oui mais non
    Il n'a pas entré "azert123.123azerty" mais "123.123marcosa" et là c'est bon car la fonction s'arrêtera au premier caractère non numérique et renverra 123.123.
    Je n'ai pas dit le contraire j'ai écris: "les fonctions atoi atol et atof acceptent uniquement les valeurs numériques, mais en revanche n'acceptent pas les valeurs non-numériques comme "azert123.123azerty". La chaîne de caractères qui vient après ou avants une série de valeurs ne peut donc être converties; d'où, le renvoi de la valeur zéro par ces fonctions." et azerty12345azerty est un exemple pour expliquer que la fonction ne convertissait pas les valeurs non-numériques.


    Citation Envoyé par Sve@r Voir le message
    Elles renverront le maximum de ce qu'elles auront pu traiter.
    je ne te suis pas, comment savoir le maximum que la fonction a traiter sachant qu'elle retourne une valeur qui est le résultat de la conversion ou zéro ?
    Tu voulais plutôt dire qu'elle renvoie la valeur zéro parce qu'elle ne peut pas effectuer la conversion ?

  7. #7
    Membre averti
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Bonsoir et bienvenue, l'erreur est due aux "marcosa" après les valeurs numérique saisie.
    Si vous regardez attentivement le résultat que vous avez obtenu vous remarquerez que les fonctions atoi atol et atof acceptent uniquement les valeurs numériques, mais en revanche n'acceptent pas les valeurs non-numériques comme "azert123.123azerty". La chaîne de caractères qui vient après ou avants une série de valeurs ne peut donc être converties; d'où, le renvoi de la valeur zéro par ces fonctions.
    Il est à noter également qu'il y a aucun moyen de savoir si la conversion a échoué. Soit vous saisissez uniquement des valeurs numériques du genre : 12345.12345, 12345.12345E+03 ou -12345.12345E-05, ou alors vous optez pour une alternative comme sscanf ou de la technicité avec les fonctions comme strtol() et strtoul() ( qui sont utilise par sscanf ) .

    Il est également préférable que vous utilisiez la fonction fgets que gets pour des questions de sécurité, car, la fonction gets() ne vérifie pas la limite maximale des caractères d'entrée cela a pour conséquence un dépassement du tampon et écrasement d'autres informations; tant dis qu'avec fgets on s'arrêtera lorsque l'on atteints la limite fixé (n-1) qui est la taille du buffer/ tampon. Ainsi, si la chaîne lue est plus longue que le tampon de réception, aucun dépassement de mémoire ne sera effectué.
    À bientôt,
    Ces fonctions ont pour l'entrée (stdin) une chaine de caractère quel que soit ses types de ses éléments ... mais elles prennent juste la première partie numérique jusqu'au premier caractère qui est non numérique .. je te conseille de lire ce chapitre concernant des fonctions utilise pour les chaines de caractères .. a propos des autres fonctions que tu les a mentionne je vais essayer de les lire et voir la différences entre eux
    Et Merci

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    je n'ai pas trop compris ce que vous avez écrit pouvez-vous m'en dire plus ?

  9. #9
    Membre averti
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Par défaut
    Voila quelque règles générales de la conversion en utilisant ces fonctions :
    -Les espaces au début d'une chaîne sont ignorés .
    -Il n'y a pas de contrôle du domaine de la cible .
    -La conversion s'arrête au premier caractère non convertible .
    -Pour une chaîne non convertible, les fonctions retournent zéro .
    En regardant la règle numéro 3 , on peut appliquer ces fonctions dans une variable déclarée comme tableau de char , cette fonction prends juste la première partie numérique ( exp '1' , '2' , '3' , ... ) et s'arrête au premier caractère non numérique , mais en respectant ces consignes ..
    J'espère que je t'ai aide .

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MouadCR7 Voir le message
    mais la question qui se pose pourquoi le compilateur l'a accepte , normalement ca aucun sens , et pourquoi il a accepte les autres fonctions sans <stdlib.h> ?
    Comme je l'ai dit, le compilateur considère toute fonction non déclarée comme "int".

    Citation Envoyé par MouadCR7 Voir le message
    a propos de la fct gets , mon compilateur n'a pas mentionne aucune chose ..
    Possible. Ton compilateur ne doit pas être comme le mien (gcc standard sous Linux). L'important c'est que tu comprennes que gets() ne bloque rien donc permet potentiellement à l'utilisateur de saisir plus de caractères que ce que "str" peut en accepter.

    Citation Envoyé par MouadCR7 Voir le message
    je vais essayer de lire le cours de ces nouveaux fonctions que je ne les connait pas ..
    Tu parles de fgets(str, n, flux) ? Pas compliqué: cette fonction lit les données en provenance du flux jusqu'à concurrence soit d'un '\n' (caractère symbolisant un <return>) soit de "n-1" caractères lus (la première des deux conditions étant décisive). Et stocke le tout dans "str". Ca évite donc de saisir plus de caractères que ce que "str" peut accepter. Seul petit handicap: le caractère '\n' s'il est lu est lui aussi stocké ce qui peut parfois gêner mais un coup de strchr() pour le trouver et on le remplace par '\0' et c'est réglé.

    Citation Envoyé par sambia39 Voir le message
    et azerty12345azerty est un exemple pour expliquer que la fonction ne convertissait pas les valeurs non-numériques.
    Ben 123.123marcosa converti en 123.123 était déjà un parfait exemple pour ça.

    Citation Envoyé par sambia39 Voir le message
    je ne te suis pas, comment savoir le maximum que la fonction a traiter sachant qu'elle retourne une valeur qui est le résultat de la conversion ou zéro ?
    Elle ne renvoie pas le résultat de la conversion ou zéro, elle renvoie le résultat de la conversion tout court (extrait du man: "RETURN VALUE: The converted value."). Et ce résultat dépend de ce qui a été converti. Dans "123.123marcosa" elle s'arrête au "m" mais a traité "123.123" donc c'est ce qu'elle renvoie. Et si elle renvoie 0 c'est parce que soit la chaine contient "000" soit elle ne contient aucun nombre donc que la fonction n'aura rien pu faire.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre averti
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Comme je l'ai dit, le compilateur considère toute fonction non déclarée comme "int".


    Possible. Ton compilateur ne doit pas être comme le mien (gcc standard sous Linux). L'important c'est que tu comprennes que gets() ne bloque rien donc permet potentiellement à l'utilisateur de saisir plus de caractères que ce que "str" peut en accepter.

    Mais pourquoi il a accepte les autres fonctions ??

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/09/2014, 12h24
  2. Fonction atof --> float
    Par Trax31 dans le forum C
    Réponses: 3
    Dernier message: 30/05/2013, 06h03
  3. probleme fonction atof()
    Par cisqo dans le forum Débuter
    Réponses: 6
    Dernier message: 08/01/2009, 11h56
  4. Bizzarerie de la fonction " atof "
    Par NeMo_O dans le forum C
    Réponses: 8
    Dernier message: 28/01/2008, 22h21
  5. fonction biblio math.h
    Par acik59 dans le forum C
    Réponses: 10
    Dernier message: 23/04/2007, 21h55

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