0


0

C ++-グローバルsetlocaleは機能しますが、_vsnprintf_lに渡された同じロケールは機能しません

次の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 Answer


3


VS2005以降(2008および2010)のCRTバグであることが判明しました。 こちらからマイクロソフトに送信:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523503#details

バグは_sprintf_l、_vsnprintf_l、_sprintf_s_l、_vsnprintf_s_lおよびその他の親族に適用されます。