C++:sprintf 考虑哪个语言环境

C++ : Which locale is considered by sprintf?

本文关键字:语言 环境 sprintf C++      更新时间:2023-10-16

我正在使用两个函数sprintf和snprintf来处理"double"到字符串的转换,在一种情况下,正在运行的应用程序的区域设置与 Windows 的区域设置不同。因此,在这种情况下,sprintf 考虑的区域设置始终是应用程序的。然而,snprintf有时会开始使用Windows语言环境。因此,两种方法返回的十进制字符不同,这会导致问题。

为了提供更多详细信息,我的项目中有一个库,它从"double"构建了一个字符串,这个库使用 snprintf 将双精度转换为字符串。然后我需要将此信息发送到可以理解"."(点(仅作为十进制符号。因此,我需要将本地十进制字符替换为"."(点(。为了找出本地十进制字符(为了替换它(,我正在使用我的项目中提供的使用 sprintf 的库之一。然后我用点替换这个字符以获得最终输出。

另外,请注意,sprintf 总是考虑本机应用程序的区域设置,而 snprintf 有时会考虑 Windows 的语言环境。由于问题不一致,很抱歉没有提供明确的例子。

那么,在什么情况下,snprintf的行为可能会有所不同?为什么这两种方法会给我如此不同的行为?我怎样才能避免它?

附言 - 我必须使用这两种方法,所以请提出一个不需要我使用任何不同方法的解决方案。

谢谢。

sprintfsnprintf使用的区域设置不是 Windows 区域设置,而是应用程序区域设置。由于此区域设置对应用程序是全局的,因此程序中的任何代码行都可以更改它。

在您的情况下,(非线程安全(解决方案可能是暂时替换snprintf调用的区域设置:

auto old = std::locale::global(std::locale::classic());
snprintf(...);
std::locale::global(old);

顺便说一句,"Windows语言环境"可以通过std::locale("")访问,您无需知道其确切名称。