当我们尝试在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
}
答案 0 :(得分:2)
如果您的应用程序代码中包含%
的格式字符串是硬编码的,那么您只需将其手动转义为%%
即可。它将显示为单个%
。
如果格式字符串中的%
符号是动态数据(可能是用户输入),那么它根本不应该是格式字符串的一部分!你应该打电话给
Log("%s", data.c_str());
而不是
Log(data);
否则,您将在应用程序中面临潜在的安全漏洞,用户(或其他潜在的攻击者)可能会引发您遇到的崩溃。
答案 1 :(得分:1)
崩溃是因为你使用的是%,这意味着格式字符串后会有一个参数。事实%q是垃圾并不重要,它正在寻找列表中的第一个参数。
如果你想打印%,你必须用另一个%
来逃避它Log("this test is%%quick"); // this will not crash
输出中只有1%