我使用两个函数sprintf和snprintf来处理" double"的转换。字符串, 在其中一种情况下,正在运行的应用程序具有与Windows不同的区域设置。语言环境。因此,在这种情况下,sprintf考虑的语言环境始终是应用程序。然而,snprintf有时会开始使用Windows语言环境。因此,两种方法返回的十进制字符都不同,这会导致问题。
提供进一步的细节, 我的项目中有一个库,它从" double"构建一个字符串,这个库使用snprintf将double转换为字符串。然后我需要将这些信息发送给服务器,这将理解"。" (点)仅作为小数符号。因此,我需要用"替换本地十进制字符。" (点)。要找出本地十进制字符(为了替换它),我使用的是我的项目中提供的一个使用sprintf的库。然后我用一个点替换这个字符以获得最终输出。
另外,请注意,sprintf总是在考虑本机应用程序的区域设置,而snprintf有时会考虑Windows的区域设置。 由于问题不一致,抱歉没有提供明确的例子。
那么,snprintf可能在哪些情况下表现不同? 为什么我会从这两种方法中获得这种不同的行为? 我怎么能避免它?
P.S。 - 我必须使用这两种方法,所以请提出一个不需要我使用任何不同方法的解决方案。
感谢。
答案 0 :(得分:6)
sprintf
和snprintf
使用的区域设置不是 Windows区域设置,而是您的应用程序区域设置。由于此语言环境对您的应用程序而言是全局的,因此程序中的任何代码行都可以更改它。
在您的情况下,(非线程安全)解决方案可能是暂时替换snprintf
调用的区域设置:
auto old = std::locale::global(std::locale::classic());
snprintf(...);
std::locale::global(old);
顺便说一句,“Windows区域设置”只能通过std::locale("")
访问,您无需知道其确切名称。