我有一个日志记录函数,它接受可变数量的参数并使用 _vsnprintf 来格式化它们。我的问题是,当我调试我的 OCR 自动化时,它返回的字符串被发送到日志,所以如果文件是这样的:
This bitmap says %n
然后它将像这样发送到我的日志记录函数:
void log(LPCSTR msg, ...)
{
char log[MAX_ALLOWED];
int length = sizeof(log) / sizeof(log[0]);
va_list argptr;
va_start( argptr, pzMsg );
// our msg accidentally has a %
if ( strchr(msg, '%') ) {
// debug assertion - no parameters were passed
_vsnprintf( log, length, msg, argptr );
}
log[length-1] = (char)0;
va_end( arg_ptr );
}
有没有办法,连同“%”的检查,我可以检查是否没有参数?谢谢。
最佳答案
确保某些内容不能被 printf 扩展的传统方法是
log("%s", yourString);
当然,您也可以添加一个只接受一个参数的 log
变体,或者您可以计算可变参数的数量,如果没有则不格式化字符串。
关于c++ _vsnprintf 意外的格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5838328/