web-dev-qa-db-fra.com

Conversion du caractère * en float ou double

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.

9
Andrew

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
25
user703016

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é.

1
George
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. 

0
John Bode