我有以下 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/