2014-12-19 106 views
3

我使用了两个函数sprintf和snprintf来处理“double”到字符串的转换, 在其中一种情况下,运行的应用程序的语言环境与Windows的语言环境不同。因此,在这种情况下,sprintf认为的语言环境始终是应用程序。而snprintf有时会开始使用Windows语言环境。因此,这两种方法返回的十进制字符是不同的,并且会导致问题。C++:sprintf认为哪种语言环境?

提供更多详细信息, 我在我的项目中有一个库,它从“double”构建一个字符串,该库使用snprintf将double转换为字符串。然后我需要将这些信息发送给服务器,这会理解“。” (点)仅作为小数点符号。因此,我需要用“。”替换本地小数字符。 (点)。要找出本地小数字符(为了替换它),我正在使用我的项目中提供的其中一个使用sprintf的库。然后我用点替换这个角色以获得最终输出。

此外,请注意,sprintf始终考虑本地应用程序的区域设置,而snprintf有时会考虑Windows的区域设置。 由于问题不一致,抱歉没有提供明确的示例。

那么,什么情况下snprintf可能会有不同的行为? 为什么我会从这两种方法中获得不同的行为? 我该如何避免它?

P.S. - 我必须使用这两种方法,所以请建议一个解决方案,不要求我使用任何不同的方法。

谢谢。

+0

'sprintf'和'snprintf'最有可能使用相同的代码来进行实际的格式设置,所以它们不应该有相互不同的行为。你能否提供一个[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve)来显示你的问题? – 2014-12-19 09:09:50

+0

对不起,由于问题不一致,我无法为您提供可验证的示例。但我可以简单地解释一下,我在我的代码中究竟做了什么。我已经编辑过我的帖子。谢谢。 – Prasad 2014-12-19 09:47:51

+0

@Prasad:重点不在于有三个例子,一个最小,一个完成,最后一个可验证。 – MSalters 2014-12-19 11:27:12

回答

4

sprintfsnprintf使用的语言环境是而不是 Windows语言环境,但是您的应用程序语言环境。由于此语言环境对您的应用程序而言是全球性的,因此程序中的任何代码行都可以更改它。

在你的情况下,(不是线程安全)的解决方案可能是暂时代替语言环境为snprintf电话:

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

顺便说一句,在“Windows区域”,可以通过只std::locale(""),你不访问不需要知道它的确切名称。

+0

正如我已经提到的,我应该只使用我的项目中提供的库。因此,做这样的改变对我来说是最后的选择。但是,您的答案仍然为我提供了查找的方向,并且您为有关方法使用的语言环境是应用程序语言环境而非Windows语言环境的非常基本的事情提供了答案。非常感谢你! – Prasad 2014-12-19 12:26:01

+0

这不是一个额外的图书馆!这是普通的C++,就像'sprintf'一样。 – MSalters 2014-12-19 17:18:55