J'ai une valeur que j'ai lue dans un fichier et qui est stockée sous la forme d'un caractère *. La valeur est un nombre monétaire, #. ##, ##. ## ou ###. ##. Je veux convertir le caractère * en un nombre que je peux utiliser dans les calculs. J'ai essayé atof et strtod et ils me donnent simplement des numéros de mémoire. Quelle est la bonne façon de faire cela et pourquoi ma façon de faire est-elle fausse?
C'est essentiellement ce que je suis en train de faire, seule la valeur char * est lue dans un fichier. Lorsque j'imprime les variables temp et ftemp, elles ne sont que des ordures, des nombres négatifs gigantesques.
Une autre édition:
Je cours exactement cela en gcc
#include <stdio.h>
int main()
{
char *test = "12.11";
double temp = strtod(test,NULL);
float ftemp = atof(test);
printf("price: %f, %f",temp,ftemp);
return 0;
}
et ma sortie est le prix: 3344336.000000, 3344336.000000
Edit: Voici mon code
if(file != NULL)
{
char curLine [128];
while(fgets(curLine, sizeof curLine, file) != NULL)
{
tempVal = strtok(curLine,"|");
pairs[i].name= strdup(tempVal);
tempVal = strtok(NULL,"|");
pairs[i].value= strdup(tempVal);
++i;
}
fclose(file);
}
double temp = strtod(pairs[0].value,NULL);
float ftemp = atof(pairs[0].value);
printf("price: %d, %f",temp,ftemp);
mon fichier d'entrée est un nom très simple, des paires de valeurs comme ceci:
NAME|VALUE
NAME|VALUE
NAME|VALUE
avec la valeur étant des montants en dollars
RESOLU: Merci à vous tous, j'utilisais% d au lieu de% f et je n'avais pas les en-têtes appropriés.
Il manque une inclusion: #include <stdlib.h>
, de sorte que GCC crée une déclaration implicite de atof
et atod
, menant à des valeurs parasites.
Et le spécificateur de format pour double est %f
, pas %d
(c'est-à-dire pour les entiers).
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *test = "12.11";
double temp = strtod(test,NULL);
float ftemp = atof(test);
printf("price: %f, %f",temp,ftemp);
return 0;
}
/* Output */
price: 12.110000, 12.110000
Le code affiché par vous est correct et aurait dû fonctionner. Mais vérifiez exactement ce que vous avez dans le char*
. Si la valeur correcte est trop grande pour être représentée, les fonctions renverront un HUGE_VAL
positif ou négatif. Vérifiez ce que vous avez dans char*
par rapport aux valeurs maximales que float
et double
peuvent représenter sur votre ordinateur.
Vérifiez cette page pour strtod
référence et cette page pour atof
référence .
J'ai essayé l'exemple que vous avez fourni sous Windows et Linux et cela a bien fonctionné.
printf("price: %d, %f",temp,ftemp);
^^^
C'est ton problème. Étant donné que les arguments sont de type double
et float
, vous devez utiliser %f
pour les deux (puisque printf
est une fonction variadique, ftemp
sera promu à double
).
%d
s'attend à ce que l'argument correspondant soit de type int
et non pas double
.
Les fonctions variées telles que printf
ne connaissent pas vraiment les types des arguments de la liste des arguments variables; vous devez le dire avec le spécificateur de conversion. Puisque vous avez dit à printf
que le premier argument est censé être un int
, printf prendra les octets sizeof (int)
suivants de la liste des arguments et les interprétera comme une valeur entière; d'où le premier numéro de poubelle.
Maintenant, il est presque garanti que sizeof (int)
<sizeof (double)
, donc lorsque printf
prend les octets sizeof (double)
suivants dans la liste des arguments, cela commence probablement par l'octet central de temp
, plutôt que par le premier octet de ftemp
; d'où le deuxième numéro de poubelle.
Utilisez %f
pour les deux.