Возможные варианты описаны ниже:
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
Это ошибка (также показанная cppcheck), потому что "scanf без ограничений ширины поля может привести к сбою с огромными входными данными в некоторых версиях libc" (см. здесь и здесь ).
2. Второй вариант: std :: sto * ()
#include <iostream>
#include <string>
int i;
float f;
double d;
std::string str;
try {
// string -> integer
int i = std::stoi(s);
// string -> float
float f = std::stof(s);
// string -> double
double d = std::stod(s);
} catch (...) {
// error management
}
Это решение короткое и элегантное, но оно доступно только на компиляторах, совместимых с C ++ 11.
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 ??
Однако при таком решении трудно отличить неверный ввод (см. здесь ).
4. Четвертый вариант: лексическая трансляция Boost
#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
}
Однако это всего лишь оболочка sstream, и в документации предлагается использовать sstrem для лучшего управления ошибками (см. здесь ).
5. Пятый вариант: strto * ()
Это решение очень длинное из-за управления ошибками, и оно описано здесь. Поскольку ни одна функция не возвращает обычное значение типа int, в случае целого числа требуется преобразование (см. здесь , чтобы узнать, как можно выполнить это преобразование).
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
Выводы
Подводя итог, можно сказать, что лучшим решением является C ++ 11 std :: stoi () или, как второй вариант, использование библиотек Qt.
Все остальные решения не приветствуются или содержат ошибки.