c++ _vsnprintf 意外的格式字符串

标签 c++ string variadic-functions printf

我有一个日志记录函数,它接受可变数量的参数并使用 _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/

相关文章:

c++ - 正则表达式检测边界,例如源代码行的注释

c++ - 要搜索一个值然后从对象数组中删除包含它的对象?

Jquery 在字符串中查找字符并应用自定义类

c++ - C++ 中带有约束类型的可变参数函数添加

c++ - 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?

c - 在 C 中,将可变函数指针转换为具有有限参数的函数指针是否安全?

c++ - 如何在我的成员函数中包含默认参数?

c++ - 编辑字符串时接收内存泄漏

c++ - C++中枚举的字符串

Java - 我应该为日志消息使用常量吗?