繁体   English   中英

scanf,printf和boost :: lexical_cast本质上是不安全的吗?

[英]Are scanf, printf and boost::lexical_cast fundamentally unsafe?

我最近遇到了一个将十进制字符串(例如"10.057" )转换为double 这个问题是与全球应用的语言环境,使用boost::lexical_cast和一些欧洲语言环境中使用的事实,为小数点。

该家族中的scanfprintf和其他功能存在相同的问题。

我很想听听其他人如何处理这个问题。

scanfprintfboost::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM