2011-04-29 93 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。所有其他人都依靠主叫方和被叫方「做對」。