[英]Are scanf, printf and boost::lexical_cast fundamentally unsafe?
我最近遇到了一个将十进制字符串(例如"10.057"
)转换为double
。 这个问题是与全球应用的语言环境,使用boost::lexical_cast
和一些欧洲语言环境中使用的事实,
为小数点。
该家族中的scanf
, printf
和其他功能存在相同的问题。
我很想听听其他人如何处理这个问题。
scanf
, printf
, boost::lexical_cast
和相关功能的行为取决于全局应用程序区域设置。 因此,它们相对于其输入参数是不确定的。 我看过类似的代码:
std::setlocale(LC_ALL, "C");
scanf(...);
但是,这不能保证在多线程环境中工作。
一种解决方案是使用允许用户显式指定语言环境的函数和类型。
iostream
流对象允许用户将语言环境指定为参数,这将产生确定性的结果。
std::istringstream istr("10.057");
istr.imbue(std::locale::classic());
double val;
istr >> val;
同样, boost::format
允许用户将语言环境指定为参数。
using boost::format;
std::string s = str(format("%lf", std::locale::classic()) % 10.057);
另请参阅上一个stackoverflow问题中的讨论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.