如何在打印类似于“%q”的字符时避免在vsprintf_s()时崩溃

时间:2017-07-26 13:11:12

标签: c++ windows

当我们尝试在string语句中打印“%q”时,vsprintf_s发生崩溃。 使用2个符号“%% q”

可以避免此崩溃

有没有办法忽略字符串打印而不是崩溃?

#include <windows.h>
#include <stdio.h>

#define LOG_LEN 1024

void Log( const CHAR * lpszFormat, ...)
{
        CHAR localBuff[2 * LOG_LEN + 1] = { 0 };
        va_list argp;

        va_start(argp, lpszFormat);
        vsprintf_s(localBuff, lpszFormat, argp);
        va_end(argp);

       ///...

       ///...

}

int main()
{
    Log("this test is quick");  // this works
    Log("this test is%quick");  // this Crashes
}

2 个答案:

答案 0 :(得分:2)

如果您的应用程序代码中包含%的格式字符串是硬编码的,那么您只需将其手动转义为%%即可。它将显示为单个%

如果格式字符串中的%符号是动态数据(可能是用户输入),那么它根本不应该是格式字符串的一部分!你应该打电话给

Log("%s", data.c_str());

而不是

Log(data);

否则,您将在应用程序中面临潜在的安全漏洞,用户(或其他潜在的攻击者)可能会引发您遇到的崩溃。

答案 1 :(得分:1)

崩溃是因为你使用的是%,这意味着格式字符串后会有一个参数。事实%q是垃圾并不重要,它正在寻找列表中的第一个参数。

如果你想打印%,你必须用另一个%

来逃避它
Log("this test is%%quick");  // this will not crash

输出中只有1%