如果输入字符串包含"%"则vsntprintf_s崩溃

时间:2015-10-01 10:08:42

标签: c++ c buffer

我有一个错误记录机制,它使用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

处理此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

处理此问题的最佳方法是始终在您的控制下使用格式字符串(我指的是您编写的代码)。您不能拥有类似“Test%Test”的格式字符串,因为这违反了格式字符串的规则。

如果要打印那个确切的字符串,那么相应的格式字符串应为“Test %% Test”。

如果字符串的内容不在您的控制之下,那么格式字符串应该只是“%s”,实际的字符串应该作为函数的下一个参数给出。