C ++ - 全局setlocale工作,传递给_vsnprintf_l的相同语言环境不起作用

时间:2010-01-05 09:14:12

标签: 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范围内的第一个字符进行复制(少数例外)。

我想在不更改进程的全局区域设置的情况下解决此问题,但命令// 3的工作方式类似于// 2,为什么?我正在传递“C”语言环境,所以我希望命令// 1的效果。

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

1 个答案:

答案 0 :(得分:3)

在VS2005及更高版本(2008年和2010年)中,它被证明是一个CRT错误。在此处提交给Microsoft:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523503#details

Bug适用于_sprintf_l,_vsnprintf_l,_sprintf_s_l,_vsnprintf_s_l以及可能的其他亲属。