我有一个日志记录函数,它接受可变数量的参数,并使用_vsnprintf对它们进行格式化。我的问题是,当我调试OCR自动化时,它返回的字符串被发送到日志,所以如果文件说这样的话:
这个位图表示%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
的变体,或者您可以计算变量参数的数量,如果没有,则不格式化字符串。
如果我理解正确,您应该检查实际传递给log()
的参数的数量。
不幸的是,这是高度特定于机器的。我知道只有一种架构提供了明确的参数计数。这就是VAX。所有其他的都依赖于调用者和被调用者来"把它做好"。