c ++ _vsnprintf意外格式字符串

时间:2011-04-29 23:20:32

标签: c++ string variadic-functions printf

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

有没有办法,以及检查'%',我可以检查是否没有参数?谢谢。

2 个答案:

答案 0 :(得分:1)

确保无法通过printf扩展某些内容的传统方法是

log("%s", yourString);

当然,您也可以添加log的变体,只需要一个参数,或者您可以计算变量参数的数量,如果没有则可以格式化字符串。

答案 1 :(得分:1)

如果我理解正确,您想检查实际传递给log()的参数数量。

不幸的是,这是高度机器特定的。我只知道一个提供明确的参数计数的架构。这就是VAX。所有其他人都依赖于来电者和被叫者来“正确行事”。