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