C++ - 全局 setlocale 有效,传递给 _vsnprintf_l 的相同语言环境无效

标签 c++ c locale printf

我有以下 C++ 代码示例:

void SetVaArgs(const char* fmt, const va_list argList)
{
  setlocale( LC_ALL, "C" );

  // 1
  m_FormatBufferLen = ::_vsnprintf(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt, argList); 

  setlocale( LC_ALL, "" );

  //2
  m_FormatBufferLen = ::_vsnprintf(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt, argList);

  _locale_t locale = _create_locale(LC_ALL, "C");;

  //3
  m_FormatBufferLen = ::_vsnprintf_l(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt,locale, argList);

arglist 包含带有扩展 ascii 字符的 LPCTSTR。命令//1 将它复制到缓冲区,如预期的那样。命令//2 在范围 129-161 的第一个字符处停止复制(那里很少有异常(exception))。

我想在不更改进程的全局语言环境的情况下解决这个问题,但是命令//3 的工作方式与//2 相同,为什么?我正在传递“C”语言环境,所以我希望命令//1 能产生效果。

默认情况下,我在英语 Windows XP 上使用波兰语区域设置。

最佳答案

原来是VS2005及以上版本(2008和2010)的CRT bug。在此处提交给 Microsoft:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523503#details

错误适用于 _sprintf_l、_vsnprintf_l、_sprintf_s_l、_vsnprintf_s_l 以及可能的其他亲属。

关于C++ - 全局 setlocale 有效,传递给 _vsnprintf_l 的相同语言环境无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005005/

相关文章:

c++ - 如何更有效地使用模板在 C++ 中实现带有绑定(bind)检查的二维数组?

c++ - 调用重载运算符失败时用户定义的枚举类隐式转换

c - 在c中使用或打印指针值

c - 访问 CIE L* a*b* 色彩空间中的像素信息

java - errorArgs 中的 Spring 3 验证 : using messages. 属性条目?

asp.net - 如何使用 UTC 时间(asp.net 和 ajax)向用户呈现本地时间

c++ - 是否有可能让 NCurses CDK 矩阵动态调整到终端窗口?

c++ - 多个客户端程序如何同时相互共享消息?

c - 如果不使用 va_args,这个 printf 代码如何工作?

linux - sabayon 中奇怪的 LANG 语言环境