scanf、printf和boost::lexical_cast基本上不安全吗?

Are scanf, printf and boost::lexical_cast fundamentally unsafe?

本文关键字:cast 基本上 不安全 lexical printf boost scanf      更新时间:2023-10-16

我最近遇到了一个将十进制字符串(例如"10.057")转换为double的错误。问题在于全球应用程序语言环境,boost::lexical_cast的使用以及一些欧洲语言环境使用,作为小数点的事实。

scanfprintf以及该家族的其他功能都存在同样的问题。

我很想听听别人是怎么处理这个问题的。

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问题的讨论