2011-04-29 94 views
0

我有一个日志记录函数,它接受可变数量的参数并使用_vsnprintf来格式化它们。我的问题是,当我调试我的OCR自动化它返回的字符串被发送到日志,所以如果该文件是这样说的:C++ _vsnprintf意外的格式字符串

此位图说%的正

那么它将获得发送到我的日志记录功能是这样的:

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); 
} 

有没有办法,随用随取的“%”,我可以检查是否有任何参数一起?谢谢。

+0

这就是'iostream'解决的问题。 – Puppy 2011-04-29 23:45:49

回答

1

不能printf的扩大,传统的方式,以确保东西

log("%s", yourString); 

当然,你也可以添加log一个变种,只需要一个参数,或者你可以指望的数量可变参数,如果没有,则不格式化字符串。

1

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

不幸的是,这是高度机器特定的。我知道只有一个架构可以提供明确的论证数量。这是VAX。所有其他人都依靠主叫方和被叫方“做对”。