Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
double konvert(char in[]) { int Einträge; // Wie kann ich die rauskriegen? int Nachkomma = 0; int Vorkomma = 0; double Ergebnis = 0; // Einträge auf Komma überprüfen for(int i = Einträge; i >= 0; i--) { if(in[i] == ',' || in[i] == '.') Nachkomma = Einträge - i-1; // Ein Nachkomma ist das Komma } Vorkomma = Einträge-Nachkomma+1; // Wieder Komma berücksichtigen for(int i = Vorkomma; i>= 0; i--) { if(i == Vorkomma) Ergebnis += in[i]; // Erste Stelle vor dem Komma zählt normal else Ergebnis += in[i] * (10^i); // Zehner zählen zehnfach, Hunderter hundertfach, etc. } // Das gleiche auch für nachkommastellen, nur antstatt Potenz, Wurzel for(int i = Einträge-Nachkomma; i<= Einträge; i++) { Ergebnis += in[i] * (10Wurzel mit i); // Zehntel, Hundertstel, etc. } } |
Quellcode |
|
1 2 3 4 5 6 7 |
#include <stdlib.h> typedef char* string; string strVar = "27"; double dVar = 0; dVar = atof(strVar); |
C-/C++-Quelltext |
|
1 2 3 4 5 |
std::stringstream stream; double d; stream << "3.1415"; stream >> d; |
C-/C++-Quelltext |
|
1 2 3 4 5 |
#include <sstream> std::ostringstream ss("3.4212"); double value; ss >> value; |
C-/C++-Quelltext |
|
1 2 3 |
#include <cstdlib> double value = std::atof("3.4212"); |
C-/C++-Quelltext |
|
1 2 3 4 5 |
std::stringstream stream; double d; stream << "3.1415"; stream >> d; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
template< typename Dest, typename Source > Dest lexical_cast( const Source& src ) { std::stringstream cnv; Dest result; if ( !( cnv << src && cnv >> result && ( cnv >> std::ws ).eof() ) ) { throw std::logic_error( "lexical_cast failed" ); } return result; } int main() { double d = lexical_cast< double >( "3.1415" ); } |
C-/C++-Quelltext |
|
1 |
double d = boost::lexical_cast< double >( "3.1415" ); |
C-/C++-Quelltext |
|
1 |
double d = atof( "3.1415" ); |
C-/C++-Quelltext |
|
1 2 3 |
double d = 3.1415; char buf[ 10 ]; sprintf( buf, "%g", d ); |
C-/C++-Quelltext |
|
1 2 |
float f = 0; sscanf( "3.1415", "%f", &f ); |
C-/C++-Quelltext |
|
1 2 |
char *pos = 0; double d = strtod( "3.1415", &pos ); |
Zitat von »"Nightvision"«
atof ist selbstverständlich veraltet und sollte aus gründen der sicherheit natürlich nicht mehr verwendet werden. Wer es aber trotzdem etwas schneller als mit der stringstream-variante haben möchte, für den ist strtod sicher eine gute variante. Auch dabei kann man eine fehlerabfrage einbauen. Hier ein Beispiel wie wir es verwenden:
Quellcode
1 2 3 4 5 6 7 8 9 10 11 (...) double _value; char* _pStr_end; // check for legal float value _value = (double)(strtod(pStr_stringToConvert,&_pStr_end)); if(*_pStr_end != '\0') { // error handling (...) } (...)
Entdeckt strtod ein 'falsches' Zeichen, dann wird die Funktion abgebrochen und der gelieferte Zeiger bleibt an der Fehlerstelle stehen. Läuft alles durch, dh. im String war wirklich ein float, dann bleibt der Zeiger am Stringende stehen.
Wie erwähnt, das ist ein Beispiel aus einem Gerätetreiber bei dem es um Geschwindigkeit ging ohne gleich Assembler zu verwenden.
Werbeanzeige