Die möglichen Optionen werden unten beschrieben:
1. Erste Option: sscanf ()
#include <cstdio>
#include <string>
int i;
float f;
double d;
std::string str;
// string -> integer
if(sscanf(str.c_str(), "%d", &i) != 1)
// error management
// string -> float
if(sscanf(str.c_str(), "%f", &f) != 1)
// error management
// string -> double
if(sscanf(str.c_str(), "%lf", &d) != 1)
// error management
Dies ist ein Fehler (auch durch cppcheck angezeigt), da "scanf ohne Feldbreitenbeschränkungen bei einigen libc-Versionen mit großen Eingabedaten abstürzen kann" (siehe hier und hier ).
2. Zweite Option: std :: sto * ()
#include <iostream>
#include <string>
int i;
float f;
double d;
std::string str;
try {
// string -> integer
int i = std::stoi(str);
// string -> float
float f = std::stof(str);
// string -> double
double d = std::stod(str);
} catch (...) {
// error management
}
Diese Lösung ist kurz und elegant, aber nur auf C ++ 11-kompatiblen Compilern verfügbar.
3. Dritte Option: sstreams
#include <string>
#include <sstream>
int i;
float f;
double d;
std::string str;
// string -> integer
std::istringstream ( str ) >> i;
// string -> float
std::istringstream ( str ) >> f;
// string -> double
std::istringstream ( str ) >> d;
// error management ??
Bei dieser Lösung ist es jedoch schwierig, zwischen schlechten Eingaben zu unterscheiden (siehe hier ).
4. Vierte Option: Boosts lexical_cast
#include <boost/lexical_cast.hpp>
#include <string>
std::string str;
try {
int i = boost::lexical_cast<int>( str.c_str());
float f = boost::lexical_cast<int>( str.c_str());
double d = boost::lexical_cast<int>( str.c_str());
} catch( boost::bad_lexical_cast const& ) {
// Error management
}
Dies ist jedoch nur ein Wrapper von sstream
, und in der Dokumentation wird empfohlen, ihn sstream
für ein besseres Fehlermanagement zu verwenden (siehe hier ).
5. Fünfte Option: strto * ()
Diese Lösung ist aufgrund des Fehlermanagements sehr lang und wird hier beschrieben. Da keine Funktion ein einfaches int zurückgibt, ist bei einer Ganzzahl eine Konvertierung erforderlich (siehe hier, wie diese Konvertierung erreicht werden kann).
6. Sechste Option: Qt
#include <QString>
#include <string>
bool ok;
std::string;
int i = QString::fromStdString(str).toInt(&ok);
if (!ok)
// Error management
float f = QString::fromStdString(str).toFloat(&ok);
if (!ok)
// Error management
double d = QString::fromStdString(str).toDouble(&ok);
if (!ok)
// Error management
Schlussfolgerungen
Zusammenfassend ist die beste Lösung C ++ 11 std::stoi()
oder als zweite Option die Verwendung von Qt-Bibliotheken. Alle anderen Lösungen sind nicht empfehlenswert oder fehlerhaft.
atoi()
?