Für Empfehlung herabgestimmt atofdie Parsing-Fehler ignoriert, statt strtof. Das solltest du besser wissen 😉
– zol
10. September 2013 um 15:42 Uhr
@Zack Ich kann nicht sagen, dass ich vor zwei Jahren überhaupt wusste, dass es das gibt. Zumal es sich anscheinend um eine C99/C++11-Funktion handelt.
– Mystisch
10. September 2013 um 16:47 Uhr
@Mystcial Oh, richtig, alle Short-Float-Funktionen waren C99. Aber strtod ist in C89 und hat den gleichen Vorteil gegenüber atof (eindeutige Analysefehler melden).
– zol
10. September 2013 um 16:51 Uhr
Beachten Sie, dass atof() gibt a zurück double, trotz seines Namens. Das Analoge ist strtod() wie strtof() kehrt zurück floatund strtold() kehrt zurück long double.
– Jonathan Leffler
4. November 2018 um 5:28 Uhr
Leider gibt es keine Möglichkeit, dies einfach zu tun. Jede Lösung hat ihre Nachteile.
Verwenden atof() oder strtof() direkt: Das werden Ihnen die meisten Leute sagen und es wird die meiste Zeit funktionieren. Wenn das Programm jedoch ein Gebietsschema festlegt oder eine Bibliothek verwendet, die das Gebietsschema festlegt (z. B. eine Grafikbibliothek, die lokalisierte Menüs anzeigt), und der Benutzer sein Gebietsschema auf eine Sprache eingestellt hat, in der das Dezimaltrennzeichen nicht vorhanden ist . (wie zum Beispiel fr_FR wo das Trennzeichen ist ,) stoppen diese Funktionen das Parsen am . und du wirst immer noch bekommen 4.0.
Verwenden atof() oder strtof() aber ändern Sie das Gebietsschema; Es geht darum, anzurufen setlocale(LC_ALL|~LC_NUMERIC, ""); vor jedem Anruf atof() oder ähnliches. Das Problem mit setlocale ist, dass es für den Prozess global ist und Sie den Rest des Programms stören könnten. Beachten Sie, dass Sie das aktuelle Gebietsschema möglicherweise mit abfragen setlocale() und stellen Sie es wieder her, nachdem Sie fertig sind.
Schreiben Sie Ihre eigene Float-Parsing-Routine. Dies kann ziemlich schnell gehen, wenn Sie keine erweiterten Funktionen wie Exponentenanalyse oder hexadezimale Gleitkommazahlen benötigen.
Beachten Sie auch, dass der Wert 4.08 kann nicht genau als Float dargestellt werden; der tatsächliche Wert, den Sie erhalten, ist 4.0799999237060546875.
Warum sollte man die Funktion atof() nicht verwenden, um String in Double umzuwandeln?
Bei Erfolg gibt die Funktion atof() die konvertierte Gleitkommazahl als Double-Wert zurück. Wenn keine gültige Konvertierung durchgeführt werden konnte, gibt die Funktion Null (0,0) zurück. Wenn der konvertierte Wert um ein Doppeltes außerhalb des Bereichs darstellbarer Werte liegen würde, verursacht dies undefiniertes Verhalten.