【问题标题】:Are scanf, printf and boost::lexical_cast fundamentally unsafe?scanf、printf 和 boost::lexical_cast 从根本上来说是不安全的吗?
【发布时间】:2016-11-15 23:13:14
【问题描述】:

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

scanfprintf 和该系列中的其他函数存在相同的问题。

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

【问题讨论】:

    标签: c++ printf locale scanf lexical-cast


    【解决方案1】:

    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 question 的讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多