Las posibles opciones se describen a continuación:
1. Primera opción: 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
Este es un error (también mostrado por cppcheck) porque "scanf sin límites de ancho de campo puede bloquearse con grandes datos de entrada en algunas versiones de libc" (ver aquí y aquí ).
2. Segunda opción: 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
}
Esta solución es corta y elegante, pero solo está disponible en compiladores compatibles con C ++ 11.
3. Tercera opción: corrientes
#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 ??
Sin embargo, con esta solución es difícil distinguir entre una entrada incorrecta (ver aquí ).
4. Cuarta opción: Boost's 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
}
Sin embargo, esto es solo un resumen sstream
, y la documentación sugiere utilizar sstream
para una mejor gestión de errores (ver aquí ).
5. Quinta opción: strto * ()
Esta solución es muy larga, debido a la gestión de errores, y se describe aquí. Como ninguna función devuelve un int simple, se necesita una conversión en caso de un número entero (vea aquí cómo se puede lograr esta conversión).
6. Sexta opción: 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
Conclusiones
En resumen, la mejor solución es C ++ 11 std::stoi()
o, como segunda opción, el uso de bibliotecas Qt. Todas las demás soluciones están desaconsejadas o tienen errores.
atoi()
?