scanf、printf和boost::lexical_cast基本上不安全吗?
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问题的讨论
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- 此陈述基本上是在count [str [j]] 中的意思
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- 将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误