Olası seçenekler aşağıda açıklanmıştır:
1. İlk seçenek: 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
Bu bir hatadır (cppcheck tarafından da gösterilir) çünkü "alan genişliği sınırları olmayan scanf bazı libc sürümlerinde büyük giriş verileriyle çökebilir" ( buraya ve buraya bakın ).
2. İkinci seçenek: 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
}
Bu çözüm kısa ve zariftir, ancak yalnızca C ++ 11 uyumlu derleyicilerde mevcuttur.
3. Üçüncü seçenek: 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 ??
Bununla birlikte, bu çözüm ile kötü girdi arasında ayrım yapmak zordur ( buraya bakın ).
4. Dördüncü seçenek: 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
}
Ancak, bu sadece bir sarıcıdır sstream
ve belgeler sstream
daha iyi hata yönetimi için kullanılmasını önermektedir ( buraya bakın ).
5. Beşinci seçenek: strto * ()
Bu çözüm hata yönetimi nedeniyle çok uzundur ve burada açıklanmaktadır. Hiçbir işlev bir düz int döndürmediği için, tamsayı olması durumunda bir dönüştürmeye ihtiyaç duyulur ( bu dönüştürmenin nasıl gerçekleştirilebileceği için buraya bakın ).
6. Altıncı seçenek: 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
Sonuçlar
Özetle, en iyi çözüm C ++ 11 std::stoi()
veya ikinci bir seçenek olarak Qt kütüphanelerinin kullanımıdır. Diğer tüm çözümler cesareti kırılmış veya buggy.
atoi()
mi