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”,实际的字符串应该作为函数的下一个参数给出。