Các tùy chọn có thể được mô tả dưới đây:
1. Tùy chọn đầu tiê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
Đây là một lỗi (cũng được hiển thị bởi cppcheck) vì "scanf không có giới hạn độ rộng trường có thể bị sập với dữ liệu đầu vào lớn trên một số phiên bản của libc" (xem tại đây và tại đây ).
2. Tùy chọn thứ hai: 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
}
Giải pháp này ngắn và thanh lịch, nhưng nó chỉ có trên các trình biên dịch tuân thủ C ++ 11.
3. Tùy chọn thứ ba: dòng
#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 ??
Tuy nhiên, với giải pháp này khó phân biệt giữa đầu vào xấu (xem tại đây ).
4. Tùy chọn thứ tư: Boost 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
}
Tuy nhiên, đây chỉ là một trình bao bọc sstream
và tài liệu đề nghị sử dụng sstream
để quản lý lỗi tốt hơn (xem tại đây ).
5. Tùy chọn thứ năm: strto * ()
Giải pháp này rất dài, do quản lý lỗi và được mô tả ở đây. Vì không có hàm nào trả về một int đơn giản, nên cần phải chuyển đổi trong trường hợp số nguyên (xem tại đây để biết cách chuyển đổi này có thể đạt được).
6. Tùy chọn thứ sáu: 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
Kết luận
Tóm lại, giải pháp tốt nhất là C ++ 11 std::stoi()
hoặc, như một tùy chọn thứ hai, sử dụng các thư viện Qt. Tất cả các giải pháp khác được khuyến khích hoặc lỗi.
atoi()
chưa