Die möglichen Optionen werden im Folgenden beschrieben:
1. 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 von cppcheck angezeigt), weil "scanf ohne Feldbreitenbegrenzung kann bei großen Eingabedaten in einigen Versionen von libc abstürzen" (siehe ici y ici ).
_2. 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 sie ist nur auf C++11-kompatiblen Compilern verfügbar.
3. 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 ici ).
4. 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 eine Umhüllung von sstream
und die Dokumentation empfiehlt die Verwendung von sstream
für ein besseres Fehlermanagement (siehe ici ).
_5. strto ()_ *
Diese Lösung ist wegen der Fehlerbehandlung sehr lang und wird hier beschrieben. Da keine Funktion einen einfachen int zurückgibt, ist im Falle von integer eine Konvertierung erforderlich (siehe ici wie diese Umwandlung erreicht werden kann).
6. 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 lässt sich sagen, dass die beste Lösung C++11 ist. std::stoi()
oder, als zweite Option, die Verwendung von Qt-Bibliotheken. Von allen anderen Lösungen wird abgeraten oder sie sind fehlerhaft.