我有以下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上使用波兰语区域设置。
答案 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以及可能的其他亲属。