c++ _vsnprintf意外格式字符串
c++ _vsnprintf unexpected format string
我有一个日志记录函数,它接受可变数量的参数,并使用_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。所有其他的都依赖于调用者和被调用者来"把它做好"。
相关文章:
- 是否可以从格式字符串中检索"width"
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 从用户定义的类生成格式字符串?
- 如何连接格式字符串?
- 如何在C++中将"%Y%m%d"格式字符串转换为time_t变量?
- CPPCHECK C++成员函数上的格式字符串
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 自定义 {fmt} 格式化函数,具有编译时格式字符串检查功能
- '|' scanf 格式字符串是什么意思
- 如何使用 msgfmt 验证格式字符串中的位置表示法占位符
- sscanf_s:格式字符串"%d"需要类型为"int *"的参数,但可变参数 4 的类型为"WORD *"
- C4477: 'fprintf' :格式字符串 '%s' 需要类型为"char *"的参数,但可变参数 1 的类型为"int *"
- 如何使用OpenSSL API从其PEM格式字符串中读取RSA公钥
- C 格式字符串宏
- C++等效于 C 的格式字符串
- 如何使用 C++ 中的 rapidjson 库从 json 格式字符串中获取值
- _vsnprintf和_vsnprintf_s的格式字符串中的可用百分比字符
- 如何将格式字符串发送到iostream
- 跨平台格式字符串
- 使用 swprintf() 打印"0x0"的格式字符串应该是什么?