001
21.12.2008, 04:36 Uhr
0xdeadbeef
Gott (Operator)
|
Einfach casten bringt dich da nicht weiter, damit wandelst du nur die Speicheradressen in floats um, wobei natürlich Unfug rauskommt.
In C++ parst man den Kram üblicherweise mit stringstream raus, also etwa:
C++: |
#include <sstream> #include <string>
int main() { char const s[] = "3.14159"; double d; std::istringstream in;
in.str(s); if(in >> d) { // d ist jetzt 3.14159 } else { // s konnte nicht geparst werden (z.B., wenn s "abc" wäre) } }
|
In diesem speziellen Fall könntest du allerdings auch auf atof aus <cstdlib> zurückgreifen:
C++: |
#include <cstdlib>
int main() { char const s[] = "3.14159"; double d = std::atof(s); }
|
Dazu ist allerdings anzumerken, dass atof, wenn der String nicht geparst werden kann (also etwa atof("abc")), Null zurückgibt, was für eine Fehlerbehandlung ausgesprochen unpraktisch sein kann.
Außerdem funktioniert die Stringstream-Variante unverändert mit std::string, atof erwartet einen C-String, dementsprechend müsstest du in dem Zusammenhang die c_str()-Methode benutzen.
Ich würde für sowas wohl eine Funktionsvorlage verwenden, etwa
C++: |
template<typename to, typename from> to convert(from const &data) { std::istringstream in; to result;
in << data; in >> result;
// Fehlerbehandlung ggf. hier, etwa // if(!in) throw data;
return result; }
// ... try { double d = convert<double>("3.14159"); } catch(...) { // Umwandlung fehlgeschlagen }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 21.12.2008 um 04:43 Uhr von 0xdeadbeef editiert. |