2012-05-28 52 views
5

我想在C程序中包裝printf(當然,實際上是_snprintf,但這個例子比較簡單),並且在獲取變量參數的時候遇到了問題。這裏是我的代碼:在C程序中包裝Printf問題

#include <stdio.h> 
#include <stdarg.h> 

void works(void) 
{ 
    printf("%d\n", 100); 
} 

void wrap_printf(const char *fmt, ...) 
{ 
    va_list args; 
    va_start(args, fmt); 
    printf(fmt, args); 
    va_end(args); 
} 

void broken(void) 
{ 
    wrap_printf("%d\n", 100); 
} 

int main(void) 
{ 
    works(); 
    broken(); 
    return 0; 
} 

這裏是我的輸出:

100 
3668388 

args變量看起來在我的代碼中調用va_start後好,但只要我一步到C運行時代碼和他們呼籲va_start的價值看起來不好。有關我可能做錯什麼的想法?

+0

可能重複的[使用va_list調用printf](http://stackoverflow.com/questions/5977326/call-printf-using-va-list) –

回答

9
va_start(args, fmt); 
vprintf(fmt, args); 
va_end(args); 

您需要致電vprintf而不是printfv*printf函數理解va_List參數。我很驚訝你沒有得到警告。

+0

當在這裏寫代碼在stackoverflow上時,一定要使用正確的代碼塊,在你的回答中沒有引用。 –

+0

@ RichardJ.RossIII謝謝:-)我還在編輯。 – cnicutar

+0

謝謝!除'_snprintf'以外不會有任何警告:此功能或變量可能不安全。考慮使用_snprintf_s代替。 – user1421964

5

你傳遞args這是一個va_list,但printf()當然希望直接的論據,它具有無法知道它的第二個參數是突然一個va_list的方式。

你應該使用vprintf(),這個可變參數版本確實期望得到va_list,並知道如何從中提取值。

+1

從技術上講,你也可以使用組裝來完成。 –