可能的选项如下所述:
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也显示了此错误),因为“在某些版本的libc上,没有字段宽度限制的scanf可能会因大量输入数据而崩溃”(请参见here和here)。
2.第二个选项: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
}
该解决方案简短而优雅,但是仅在符合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的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
}
但是,这只是的包装sstream
,文档建议使用sstream
进行更好的错误管理(请参阅此处))。
5.第五个选项:strto *()
由于存在错误管理,此解决方案非常长,在此进行描述。由于没有函数返回纯整数,因此在整数的情况下需要进行转换(有关如何实现此转换的信息,请参见此处)。
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库。不建议使用其他解决方案或进行故障检查。
atoi()
吗?