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.
Der von Ihnen gepostete Code ist korrekt und hätte funktionieren sollen. Aber überprüfe genau, was du in %code% hast. Wenn der richtige Wert zu groß ist, um dargestellt zu werden, geben Funktionen einen positiven oder negativen %code% zurück. Überprüfe, was du in %code% gegen maximale Werte hast, die %code% und %code% auf deinem Computer darstellen können.
Überprüfen Sie diese Seite auf %code% reference und diese Seite für %code% reference .
Ich habe das Beispiel ausprobiert, das Sie in Windows und Linux zur Verfügung gestellt haben, und es hat gut funktioniert.
Sie vermissen ein Include: %code% , daher erstellt GCC eine implizite Deklaration von %code% und %code% , was zu Garbage-Werten führt.
Und der Formatbezeichner für double ist %code% , nicht %code% (also für ganze Zahlen).
%Vor%Das ist dein Problem. Da die Argumente vom Typ %code% und %code% sind, sollten Sie %code% für beide verwenden (da %code% eine variadische Funktion ist, %code% wird zu %code% hochgestuft).
%code% erwartet das entsprechende Argument vom Typ %code% , nicht %code% .
Variadische Funktionen wie %code% kennen die Typen der Argumente in der Variablenargumentliste nicht wirklich; Sie müssen es mit dem Konvertierungsspezifizierer angeben. Da du %code% gesagt hast, dass das erste Argument ein %code% sein soll, wird printf die nächste %code% Bytes aus der Argumentliste nehmen und sie als einen ganzzahligen Wert interpretieren; daher die erste Müllnummer.
Nun ist es fast garantiert, dass %code% & lt; %code% , also wenn %code% die nächste %code% Bytes von der Argumentliste übernimmt, beginnt es wahrscheinlich mit dem mittleren Byte von %code% , anstatt mit dem ersten Byte von %code% ; daher die zweite Müllnummer.
Verwenden Sie %code% für beide.