Umwandlung von char * in float oder double

7

Ich habe einen Wert, den ich aus einer Datei eingelesen habe und der als Char * gespeichert ist. Der Wert ist eine monetäre Nummer, #. ##, ##. ## oder ###. ##. Ich möchte das char * in eine Zahl umwandeln, die ich in Berechnungen verwenden kann, ich habe atof und strtod ausprobiert und sie geben mir nur Müllnummern. Was ist der richtige Weg, um dies zu tun, und warum ist die Art, wie ich es falsch mache?

Das ist im Wesentlichen was ich mache, nur der char * -Wert wird aus einer Datei eingelesen. Wenn ich die Variablen temp und ftemp ausdrucke, sind sie nur Müll, gigantische negative Zahlen.

Noch eine Bearbeitung:

Ich führe genau das in gcc

aus %Vor%

}

und meine Ausgabe ist Preis: 3344336.000000, 3344336.000000

Bearbeiten: Hier ist mein Code

%Vor%

meine Eingabedatei ist ein sehr einfacher Name, Wertepaare wie folgt:

%Vor%

mit dem Wert, der Dollarbeträge ist

Gelöst: Ich danke Ihnen allen, ich habe% d anstelle von% f und hatte nicht die richtigen Header enthalten.

    
Andrew 15.05.2012, 17:11
quelle

3 Antworten

21

Sie vermissen ein Include: #include <stdlib.h> , daher erstellt GCC eine implizite Deklaration von atof und atod , was zu Garbage-Werten führt.

Und der Formatbezeichner für double ist %f , nicht %d (also für ganze Zahlen).

%Vor%     
user703016 15.05.2012, 17:40
quelle
1

Der von Ihnen gepostete Code ist korrekt und hätte funktionieren sollen. Aber überprüfe genau, was du in char* hast. Wenn der richtige Wert zu groß ist, um dargestellt zu werden, geben Funktionen einen positiven oder negativen HUGE_VAL zurück. Überprüfe, was du in char* gegen maximale Werte hast, die float und double auf deinem Computer darstellen können.

Überprüfen Sie diese Seite auf strtod reference und diese Seite für atof reference .

Ich habe das Beispiel ausprobiert, das Sie in Windows und Linux zur Verfügung gestellt haben, und es hat gut funktioniert.

    
George 15.05.2012 17:26
quelle
0
%Vor%

Das ist dein Problem. Da die Argumente vom Typ double und float sind, sollten Sie %f für beide verwenden (da printf eine variadische Funktion ist, ftemp wird zu double hochgestuft).

%d erwartet das entsprechende Argument vom Typ int , nicht double .

Variadische Funktionen wie printf kennen die Typen der Argumente in der Variablenargumentliste nicht wirklich; Sie müssen es mit dem Konvertierungsspezifizierer angeben. Da du printf gesagt hast, dass das erste Argument ein int sein soll, wird printf die nächste sizeof (int) Bytes aus der Argumentliste nehmen und sie als einen ganzzahligen Wert interpretieren; daher die erste Müllnummer.

Nun ist es fast garantiert, dass sizeof (int) & lt; sizeof (double) , also wenn printf die nächste sizeof (double) Bytes von der Argumentliste übernimmt, beginnt es wahrscheinlich mit dem mittleren Byte von temp , anstatt mit dem ersten Byte von ftemp ; daher die zweite Müllnummer.

Verwenden Sie %f für beide.

    
John Bode 15.05.2012 17:51
quelle

Tags und Links