vsntprintf_s 如果输入字符串包含“%”则崩溃
vsntprintf_s crashes if input string contains "%"
我有一个错误记录机制,它使用 vsntprintf_s
构造一个缓冲区。
不幸的是,如果它看到一个 "%"
符号,那么在构建缓冲区时就会出现异常。
TCHAR szBuffer[2000];
if (lpszFormat != NULL)
_vsntprintf_s(szBuffer, _countof(szBuffer), lpszFormat, args);
全函数-
bool someFunction::TraceLog (LPCTSTR lpszFormat, ...)
{
va_list args = nullptr;
va_start (args, lpszFormat);
TCHAR szBuffer[2000];
if (lpszFormat != NULL)
_vsntprintf_s(szBuffer, _countof(szBuffer), lpszFormat, args);
else
_tcsncpy_s (szBuffer, _T("NULL format for TraceGen"), _TRUNCATE);
}
其中,如果输入字符串 lpszFormat
包含“%”,则失败。 "%"
并不是一个运算符,而是字符串本身中的某些东西。例如。 Test%Test
处理此问题的最佳方法是什么?
处理此问题的最佳方法是始终控制格式字符串(我指的是您编写的代码)。您不能使用像 "Test%Test" 这样的格式字符串,因为这违反了格式字符串的规则。
如果你想打印那个确切的字符串那么相应的格式字符串应该是 "Test%%Test".
如果字符串的内容不受您的控制,那么格式字符串应该只是“%s”,实际的字符串应该作为函数的下一个参数给出。
我有一个错误记录机制,它使用 vsntprintf_s
构造一个缓冲区。
不幸的是,如果它看到一个 "%"
符号,那么在构建缓冲区时就会出现异常。
TCHAR szBuffer[2000];
if (lpszFormat != NULL)
_vsntprintf_s(szBuffer, _countof(szBuffer), lpszFormat, args);
全函数-
bool someFunction::TraceLog (LPCTSTR lpszFormat, ...)
{
va_list args = nullptr;
va_start (args, lpszFormat);
TCHAR szBuffer[2000];
if (lpszFormat != NULL)
_vsntprintf_s(szBuffer, _countof(szBuffer), lpszFormat, args);
else
_tcsncpy_s (szBuffer, _T("NULL format for TraceGen"), _TRUNCATE);
}
其中,如果输入字符串 lpszFormat
包含“%”,则失败。 "%"
并不是一个运算符,而是字符串本身中的某些东西。例如。 Test%Test
处理此问题的最佳方法是什么?
处理此问题的最佳方法是始终控制格式字符串(我指的是您编写的代码)。您不能使用像 "Test%Test" 这样的格式字符串,因为这违反了格式字符串的规则。
如果你想打印那个确切的字符串那么相应的格式字符串应该是 "Test%%Test".
如果字符串的内容不受您的控制,那么格式字符串应该只是“%s”,实际的字符串应该作为函数的下一个参数给出。