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 :

transformer float en char


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut transformer float en char
    bonjour à tous,
    J'essaie en vain de convertir du float en char pour être plus précis j'ai converti du char en float avec la fonction atof et je voudrais reconvertir ce float en char en utilisant la fonction sprintf :
    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
    29
    30
    31
    #include <stdio.h>
    #include <stdlib.h>
    int main (int argc, char *argv[])
    {
      double plusgrand;
      int i;
      char buf[256];
      if (argc<3)  /* argc nombre de paramètres passés au programme */
      {
        printf("pas assez de paramètres\n");
        return -1;
      }
      plusgrand=atof(argv[1]);         
      for (i=2;i<argc;i++)
      {
        printf("Valeur de argv i-1 = %s\n", argv[i-1]);
        printf("valeur de atof i-1 = %f\n", atof(argv[i-1]));
        printf("Valeur de argv i = %s\n", argv[i]);
        printf("valeur de atof i = %f\n", atof(argv[i]));
        if (atof(argv[i])>atof(argv[i-1]))
          {
            sprintf(buf, "%s",plusgrand); /* c'est içi que j'utilise la fonction sprintf */
            printf("i>i-1...plusgrand est %s\n",buf);
          }
      }
      printf("Le plus grand est %f\n", plusgrand);
      sprintf(buf, "%s",plusgrand);
      printf("Le + grand est %s\n",buf);
      return 0;
    }
    il me renvoit :i>i-1...plusgrand est (null)
    )


    Si quelqu'un peut m'"expliquer Merçi

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    plusgrand est un double, tu dois donc utiliser "%f" et non "%s"

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Je ne peux que souscrire à la remarque de Neckara

    Juste au passage, le reste du code mérite aussi un petit coup d'oeil, si tu veux, par exemple que le résultat affiché ne soit pas systématiquement la première valeur entrée en paramétre, il faut penser à modifier la valeur de la variable plusgrand

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Si les paramètres de ton programme ne sont pas des nombres, la fonction atof() rend un résultat erroné mais tu ne peux pas le savoir. Il faut lui préférer la fonction strtod() qui permet de vérifier la validité du retour si la robustesse de ton programme est importante*.

    Voir : http://man.developpez.com/man3/atof.3.php et http://man.developpez.com/man3/strtod.3.php

    * : j'ai même envie de dire qu'il vaut mieux toujours utiliser strtod() même si on ne se sert pas des vérifications d'erreur, histoire de bannir atof().

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par pythéas Voir le message
    Je ne peux que souscrire à la remarque de Neckara

    Juste au passage, le reste du code mérite aussi un petit coup d'oeil, si tu veux, par exemple que le résultat affiché ne soit pas systématiquement la première valeur entrée en paramétre, il faut penser à modifier la valeur de la variable plusgrand
    oui effectivement j'avais fais une erreur dans la copie du programme :
    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
    29
    30
    31
    32
    33
    34
     
    #include <stdio.h>
    #include <stdlib.h>
    int main (int argc, char *argv[])
    {
      double plusgrand;
      int i;
      char buf[256];
       if (argc<3)  /* argc nombre de paramètres passés au programme */
      {
        printf("pas assez de paramètres\n");
        return -1;
      }  
      plusgrand=atof(argv[1]);
      for (i=2;i<argc;i++)
      {
        printf("Valeur de argv i-1 = %s\n", argv[i-1]);
        printf("valeur de atof i-1 = %f\n", atof(argv[i-1]));
        printf("Valeur de argv i = %s\n", argv[i]);
        printf("valeur de atof i = %f\n", atof(argv[i]));
        if (atof(argv[i])>atof(argv[i-1]))
          {
            plusgrand=atof(argv[i]);
            sprintf(buf, "%f",plusgrand);
            printf("i>i-1...plusgrand est %s\n",buf);
          }
      }
      printf("Le plus grand est %f\n", plusgrand);
      sprintf(buf, "%f",plusgrand);
      printf("Le + grand est %s\n",buf);
      sprintf(buf, "%s",prenom);  
      printf ("prenom = : %s\n", buf);
      return 0;
    }
    Merçi pour ta réponse

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut réponse à Bktero
    Citation Envoyé par Bktero Voir le message
    Si les paramètres de ton programme ne sont pas des nombres, la fonction atof() rend un résultat erroné mais tu ne peux pas le savoir. Il faut lui préférer la fonction strtod() qui permet de vérifier la validité du retour si la robustesse de ton programme est importante*.

    Voir : http://man.developpez.com/man3/atof.3.php et http://man.developpez.com/man3/strtod.3.php

    * : j'ai même envie de dire qu'il vaut mieux toujours utiliser strtod() même si on ne se sert pas des vérifications d'erreur, histoire de bannir atof().
    Merçi pour ta réponse.
    En fait j'ai modifié le 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
    28
    29
    30
    31
    32
     
    #include <stdio.h>
    #include <stdlib.h>
    int main (int argc, char *argv[])
    {
      double plusgrand;
      int i;
      char buf[256];
     if (argc<3)  /* argc nombre de paramètres passés au programme */
      {
        printf("pas assez de paramètres\n");
        return -1;
      }  
      plusgrand=atof(argv[1]);
      for (i=2;i<argc;i++)
      {
        printf("Valeur de argv i-1 = %s\n", argv[i-1]);
        printf("valeur de atof i-1 = %f\n", atof(argv[i-1]));
        printf("Valeur de argv i = %s\n", argv[i]);
        printf("valeur de atof i = %f\n", atof(argv[i]));
        if (atof(argv[i])>atof(argv[i-1]))
          {
            plusgrand=atof(argv[i]);
            sprintf(buf, "%f",plusgrand);
            printf("i>i-1...plusgrand est %s\n",buf);
          }
      }
      printf("Le plus grand est %f\n", plusgrand);
      sprintf(buf, "%f",plusgrand);
      printf("Le + grand est %s\n",buf);
      return 0;
    }
    Sans aller pour l'instant sur la fonction strtod(), j'ai une réponse autre que Null mais pas une réponse en char mais en float !!!
    Si tu sais pourquoi merçi de m'informer

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Ton programme marche on dirait (j'ai fait un essai rapide) ?

    Quel est ton problème est strtod ? As-tu regardé les liens que je t'ai donné ?

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Comme Bktero, j'ai fait un petit essais et le programme a l'air de fonctionner correctement.

    Citation Envoyé par xeron33 Voir le message
    j'ai une réponse autre que Null mais pas une réponse en char mais en float !!!
    Ca, c'est assez obscur comme problème. Je sais pas si ça correspond à ce que tu recherches mais tu peux formater la valeur de ton float lorsque tu le converti en char*, par exemple, si tu ne veux que deux chiffres après la virgule tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(buf, "%.2f",plusgrand);
    Si jamais ça répond à ton besoin, il est facile de trouver de la doc sur le formatage avec printf ou sprintf, sur le net en général ou sur ce site en particulier (même chose pour strtod)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut réponse à Bktero et à pythéas
    Merçi pour vos réponses, en fait oui le programme fonctionne mais l'affichage est de la forme :

    i>i-1...plusgrand est 200.000000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sprintf(buf, "%f",plusgrand); /* plusgrand au départ float  içi transformé en char dans buf*/
    printf("i>i-1...plusgrand est %s\n",buf); /* et là j'affiche  buf */
    au lieu (puisque je le retransforme en char avec sprintf) comme ceci par exemple :

    Valeur de argv i = 200

    C'est ça que je ne comprends pas.
    Pour ce qui est de la fonction strtod je ne m'y suis pas penché pour l'instant dessus car je voudrais résoudre cette énigme.

    MErçi encore

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Il n'y a aucune énigme, 6 décimales c'est la précision par défaut.

    Si par exemple tu veux écrire aussi peu de décimale que nécessaire (et disons, au maximum 6) le code suivant devrait te convenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprintf(buf, "%.6g",plusgrand); /* plusgrand au départ float  ici transformé en char dans buf*/
    printf("i>i-1...plusgrand est %s\n",buf); /* et là j'affiche  buf */
    En tout cas le mieux c'est de voir comment fonctionne le formatage :
    http://man.developpez.com/man3/printf.3.php

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Merçi pour vos réponses, en fait oui le programme fonctionne mais l'affichage est de la forme...
    Au passage je ne suis pas tout à fait sûr que le programme fonctionne, si tu cherches bien le maximum dans une liste de n flotants passés en paramètres, je pense que la ligne suivante va te poser problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (atof(argv[i])>atof(argv[i-1]))
    Es-tu certain de devoir comparer la dernière valeur lue à la valeur qui la précéde et pas à autre chose?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut réponse à pythéas
    Citation Envoyé par pythéas Voir le message
    Au passage je ne suis pas tout à fait sûr que le programme fonctionne, si tu cherches bien le maximum dans une liste de n flotants passés en paramètres, je pense que la ligne suivante va te poser problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (atof(argv[i])>atof(argv[i-1]))
    Es-tu certain de devoir comparer la dernière valeur lue à la valeur qui la précéde et pas à autre chose?

    Merçi pour ton aide, j'ai modifié le code comme tu me l'as suggéré et ça marche en effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(buf, "%6g",plusgrand);
    Pour ce qui est de ta remarque pour comparer les valeurs tu as raison mais je voulais juste comparer deux valeurs.
    Pour ce qui est de la fonction strtod, je vais essayer de prendre le temps de la tester car mon programme ne fonctionne que si je rentre deux nombres.
    A +
    Merçi encore

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut StrTod
    J'ai essayé la fonction strttod mais elle ne renvoie pas de réél et j'ai une erreur de segmentation à l'exécution j'aurai utilisé une adresse mémoire qui n'appartient pas à mon programme si j'ai bien compris les cours et tutos du net.
    Voiçi une partie du 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <limits.h>
    #include <string.h>
    int main (int argc, char *argv[])
    {
      double plusgrand,plusgrand2;
      char *ch;
      char *endptr;
      int i;
      char buf[256];
      plusgrand=atof(argv[1]);
      for (i=2;i<argc;i++)
    /*20 */  {
        printf("Valeur de argv i-1 = %s\n", argv[i-1]);
        printf("valeur de atof i-1 = %f\n", atof(argv[i-1]));
        strcpy(ch,"ZZZ");
        plusgrand2 = strtod(ch, &endptr);          
        printf("Valeur de argv i = avec strtod %f\n", plusgrand2);
    Si quelqu'un peut m'aider MERCI

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Houlà, je crois que tu t'es un peu emmêlé les pinceaux.
    Déjà, avant d'arriver à strtod cette ligne suffit à faire une erreur de segmentation :
    puisque nul part tu n'alloues de mémoire pour la variable ch.
    D'ailleurs je ne sais pas trop à quoi elle est sensé servir.

    Pour strtod, dans un premier temps tu peux ignorer le second paramètre et le mettre à NULL, le premier paramètre étant la chaine à convertir en double. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plusgrand2 = strtod(argv[i-1], NULL);
    devrait fonctionner.

    Bon courage

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut réponse à pythéas
    Citation Envoyé par pythéas Voir le message
    Houlà, je crois que tu t'es un peu emmêlé les pinceaux.
    Déjà, avant d'arriver à strtod cette ligne suffit à faire une erreur de segmentation :
    puisque nul part tu n'alloues de mémoire pour la variable ch.
    D'ailleurs je ne sais pas trop à quoi elle est sensé servir.

    Pour strtod, dans un premier temps tu peux ignorer le second paramètre et le mettre à NULL, le premier paramètre étant la chaine à convertir en double. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plusgrand2 = strtod(argv[i-1], NULL);
    devrait fonctionner.

    Bon courage
    Merçi de ta réponse, en effet j'ai modiifié le 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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (int argc, char *argv[])
    {
       double plusgrand,plusgrand2;
       char *ch;
       ch=(char *) malloc (10 * sizeof (char));
      if (argc<3)  /* argc nombre de paramètres passés au programme */
      {
        printf("pas assez de paramètres\n");
        return -1;
      } 
     
        plusgrand=atof(argv[1]);
      for (i=2;i<argc;i++)
    /*20 */  {
        printf("Valeur de argv i-1 = %s\n", argv[i-1]);
        printf("valeur de atof i-1 = %f\n", atof(argv[i-1]));
        plusgrand2 = strtod(argv[i-1], NULL);
        printf("Valeur de plusgrand2 = avec strtod %lf\n", plusgrand2);
    Plus de problème de segmentation mais strtod ne renvoie rien quand je lance le programme avec des paramètres alpha :

    /Langage_C/Plus_grand$ ./plus_grand AAA ZZZ
    Valeur de argv i-1 = AAA
    valeur de atof i-1 = 0.000000
    Valeur de plusgrand2 = avec strtod 0.000000
    Valeur de argv i = ZZZ

    Quand je lance :
    /Langage_C/Plus_grand$ ./plus_grand 100 200
    Valeur de argv i-1 = 100
    valeur de atof i-1 = 100.000000
    Valeur de plusgrand2 = avec strtod 100.000000
    Valeur de argv i = 200
    valeur de atof i = 200.000000

    Là la fonction me renvoie bien un double.
    Ma question : strtod ne fonctionne qu'avec des numériques ?
    MErçi

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Ma question : strtod ne fonctionne qu'avec des numériques ?
    MErçi
    Euh.. Oui, cette fonction converti des string en doubles tu voudrais qu'elle fasse quoi d'un 'ZZZ'? Mettre un zéro lorsque la valeur n'est pas interprétable ne me semble pas absurde, atof fait la même chose. L'intérêt de strtod c'est justement qu'il donne des infos sur ce qu'il a fait.

    Prends cinq minutes pour lire la doc sur strtod et tout devrait s'éclaircir.

  17. #17
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Comme l'a dit Pythéas, atof() ne fait rien de différent de strtod() si tu regardes uniquement le retour de ces fonctions. Il faut lire la doc pour comprendre l'intérêt de strtod() et surtout comment utiliser son petit plus.

    La documentation est un peu compliquée au premier abord : http://man.developpez.com/man3/strtod.3.php

    Il faut bien se poser et réfléchir.

    La FAQ propose une entrée sur la conversion de chaine en nombre : http://c.developpez.com/faq/index.ph...RINGS_numtostr mais elle a un problème, car elle ne gère pas les cas où toute la chaine a été convertie mais la valeur dépasse le format.

    Voici un exemple de code avec strtol(), qui fonctionne quasiment de la même manière :
    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
     
        char buffer[100] = {0};   // buffer le texte
        char * endptr = NULL;   // pour les differentes verifications
        long number=0;          // pour tester si convertible
        number = strtol(buffer, &endptr, 10);
     
        if (   (buffer[0]!='\0')
            && (*endptr=='\0')
            && ((number!=LONG_MAX) || ((number==LONG_MAX) && (errno!=ERANGE)))
            && ((number!=LONG_MIN) || ((number==LONG_MIN) && (errno!=ERANGE))) )
        {
            return 0;  // OK
        }
        else
        {
            return 1; // erreur de convertion
        }

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut réponse à spythéas et à Bktero
    Citation Envoyé par Bktero Voir le message
    Comme l'a dit Pythéas, atof() ne fait rien de différent de strtod() si tu regardes uniquement le retour de ces fonctions. Il faut lire la doc pour comprendre l'intérêt de strtod() et surtout comment utiliser son petit plus.

    La documentation est un peu compliquée au premier abord : http://man.developpez.com/man3/strtod.3.php

    Il faut bien se poser et réfléchir.

    La FAQ propose une entrée sur la conversion de chaine en nombre : http://c.developpez.com/faq/index.ph...RINGS_numtostr mais elle a un problème, car elle ne gère pas les cas où toute la chaine a été convertie mais la valeur dépasse le format.

    Voici un exemple de code avec strtol(), qui fonctionne quasiment de la même manière :
    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
     
        char buffer[100] = {0};   // buffer le texte
        char * endptr = NULL;   // pour les differentes verifications
        long number=0;          // pour tester si convertible
        number = strtol(buffer, &endptr, 10);
     
        if (   (buffer[0]!='\0')
            && (*endptr=='\0')
            && ((number!=LONG_MAX) || ((number==LONG_MAX) && (errno!=ERANGE)))
            && ((number!=LONG_MIN) || ((number==LONG_MIN) && (errno!=ERANGE))) )
        {
            return 0;  // OK
        }
        else
        {
            return 1; // erreur de convertion
        }
    Merçi à vous deux pour vos réponses, j'ai consulté le man de strtod et je pense que j'avais pas tout suivi car je voulais convertir du texte ("A","BBB", "CCC") en nombre et si j'ai bien tout suivi strtod ne convertit que des chaines contenant des numériques("15") par exemple, c'est pour ça que j'avais des réponses " 0.000000" .
    Etant pas trés habitué au C, je pense que la transformation des chaines alphabétiques est impossible ou alors en ASCII.
    J'ai modifié un peu le code pour permettre de détailler la réponse strtod qui renvoie un pointeur sur endptr et si aucune conversion n'est possible, renvoie zéro.
    Toutefois j'ai testé avec une chaine contenant du numérique et les fonctions atof et strtod renvoie les mêmes conversions:

    prenom converti avec strtod = 15.000000
    prenom converti avec atof = 15.000000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     char prenom[] = "15"; 
     ....
      plusgrand2=strtod(prenom,NULL);
      printf("prenom converti avec strtod = %lf\n",plusgrand2);
      plusgrand2=atof(prenom);
      printf("prenom converti avec atof = %lf\n",plusgrand2);
    Voiçi le reste du 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
    28
     
    #include <stdio.h>
    #include <stdlib.h>
    int main (int argc, char *argv[])
    {
      double plusgrand,plusgrand2;
      char *ch,**endptr;
      char buf[256];
      char prenom[] = "tintin"; 
      ch=(char *) malloc (10 * sizeof (char));
      endptr=(char **) malloc (sizeof (char));
      if (argc<3)  /* argc nombre de paramètres passés au programme */
      {
        printf("pas assez de paramètres\n");
        return -1;
      } 
       plusgrand=atof(argv[1]);
      for (i=2;i<argc;i++)
    /*20 */  {
        printf("Valeur de argv i-1 = %s\n", argv[i-1]);
        printf("valeur de atof i-1 = %f\n", atof(argv[i-1]));
        /*if (plusgrand2 = strtod(argv[i-1], NULL)==0) printf("aucune conversion n'est effectuée,avec strtod zéro est renvoyé\n");*/
        if (strtod(argv[i-1], endptr)==0)
          {
            printf("aucune conversion n'est effectuée,avec strtod zéro est renvoyé\n");
            printf("endptr = %p\n",*endptr);
          }
        plusgrand2 = strtod(argv[i-1], NULL);
    Valeur de argv i-1 = aaa
    valeur de atof i-1 = 0.000000
    aucune conversion n'est effectuée,avec strtod zéro est renvoyé
    endptr = 0xbfd71724

    Merçi encore.
    A +

Discussions similaires

  1. Convertir un double ou float en *char
    Par Nono Sto dans le forum Langage
    Réponses: 7
    Dernier message: 12/04/2010, 09h18
  2. Cast float to char
    Par Celelibi dans le forum C++
    Réponses: 6
    Dernier message: 28/03/2009, 19h37
  3. Transformer 4 unsigned char en 1 double
    Par fxaguessy dans le forum SL & STL
    Réponses: 8
    Dernier message: 13/01/2009, 20h50
  4. Conversion Float vers char[4]
    Par Argol_Medusa dans le forum C++
    Réponses: 16
    Dernier message: 02/05/2008, 15h15
  5. Transformer un champ CHAR en décimal
    Par ALLB dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 19/07/2004, 13h59

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