C++:sprintf 考虑哪个语言环境
C++ : Which locale is considered by sprintf?
我正在使用两个函数sprintf和snprintf来处理"double"到字符串的转换,在一种情况下,正在运行的应用程序的区域设置与 Windows 的区域设置不同。因此,在这种情况下,sprintf 考虑的区域设置始终是应用程序的。然而,snprintf有时会开始使用Windows语言环境。因此,两种方法返回的十进制字符不同,这会导致问题。
为了提供更多详细信息,我的项目中有一个库,它从"double"构建了一个字符串,这个库使用 snprintf 将双精度转换为字符串。然后我需要将此信息发送到可以理解"."(点(仅作为十进制符号。因此,我需要将本地十进制字符替换为"."(点(。为了找出本地十进制字符(为了替换它(,我正在使用我的项目中提供的使用 sprintf 的库之一。然后我用点替换这个字符以获得最终输出。
另外,请注意,sprintf 总是考虑本机应用程序的区域设置,而 snprintf 有时会考虑 Windows 的语言环境。由于问题不一致,很抱歉没有提供明确的例子。
那么,在什么情况下,snprintf的行为可能会有所不同?为什么这两种方法会给我如此不同的行为?我怎样才能避免它?
附言 - 我必须使用这两种方法,所以请提出一个不需要我使用任何不同方法的解决方案。
谢谢。
sprintf
和snprintf
使用的区域设置不是 Windows 区域设置,而是应用程序区域设置。由于此区域设置对应用程序是全局的,因此程序中的任何代码行都可以更改它。
在您的情况下,(非线程安全(解决方案可能是暂时替换snprintf
调用的区域设置:
auto old = std::locale::global(std::locale::classic());
snprintf(...);
std::locale::global(old);
顺便说一句,"Windows语言环境"可以通过std::locale("")
访问,您无需知道其确切名称。
- "C.UTF-8" C++ Windows 上的语言环境?
- 有没有办法为macOS上的C++程序指定自定义语言环境目录
- 如何使用特定语言环境将 u32string (char32_t) 大写?
- 如何在 c++ 中处理 ifstream、cout 等的多个语言环境
- std::ifstream 在二进制模式下,语言环境在 C++ 中
- 如何更改CIN的语言环境
- C 字符串通过自定义语言环境进行小写
- swprintf语言环境
- std::wstring中ASCII符号的字节表示,具有不同的语言环境
- 语言环境"en_US"中 std::time_get::get_time() 的正确时间格式是什么?
- 在QT中更改语言环境
- 为什么非unicode应用程序系统语言环境使Unicode字体具有错误显示的符号字符
- 是否可以让boost语言环境边界分析在撇号上进行拆分
- 当 matlab 找不到语言环境数据库时,这意味着什么?
- C++:sprintf 考虑哪个语言环境
- 如何使用德语语言环境在gdb中设置双变量
- 如何本地加载XML语言环境文件
- std:: lower的行为在不同的语言环境中是如何变化的?
- Boost语言环境转换
- 如何获得语言环境名称为我的线程