Opsi yang mungkin dijelaskan di bawah ini:
1. Opsi pertama: 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
Ini adalah kesalahan (juga ditunjukkan oleh cppcheck) karena "scanf tanpa batas lebar bidang dapat macet dengan data input besar pada beberapa versi libc" (lihat di sini , dan di sini ).
2. Opsi kedua: 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
}
Solusi ini pendek dan elegan, tetapi hanya tersedia pada kompiler yang memenuhi C ++ 11.
3. Opsi ketiga: 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 ??
Namun, dengan solusi ini sulit untuk membedakan antara input yang buruk (lihat di sini ).
4. Opsi keempat: 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
}
Namun, ini hanya pembungkus sstream
, dan dokumentasi menyarankan untuk digunakan sstream
untuk manajemen kesalahan yang lebih baik (lihat di sini ).
5. Opsi kelima: strto * ()
Solusi ini sangat panjang, karena manajemen kesalahan, dan dijelaskan di sini. Karena tidak ada fungsi yang mengembalikan int polos, konversi diperlukan jika integer (lihat di sini bagaimana konversi ini dapat dicapai).
6. Opsi keenam: 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
Kesimpulan
Kesimpulannya, solusi terbaik adalah C ++ 11 std::stoi()
atau, sebagai opsi kedua, penggunaan pustaka Qt. Semua solusi lain tidak disarankan atau bermasalah.
atoi()
?