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:
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
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:
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
réponse à spythéas et à Bktero
Citation:
Envoyé par
Bktero
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:
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:
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:
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 +