2010-02-01 37 views
5
void printLine(const wchar_t* str, ...) 
{ 
    // have to do something to make it work 
    wchar_t buffer[2048];   
    _snwprintf(buffer, 2047, ????); 
    // work with buffer 
} 

printLine(L"%d", 123); 

我試圖是否可以直接傳遞C省略號碼?

va_list vl; 
    va_start(vl,str); 

和像這樣的事情,但我沒有找到一個解決方案。

+0

FWIW這個詞是 '省略號' 而不是 '橢圓形'。 – 2010-02-01 17:12:37

回答

9

這是一個簡單的C代碼,你必須包含stdarg.h才能工作。

 
void panic(const char *fmt, ...){ 
    char buf[50]; 

    va_list argptr; /* Set up the variable argument list here */ 

    va_start(argptr, fmt); /* Start up variable arguments */ 

    vsprintf(buf, fmt, argptr); /* print the variable arguments to buffer */ 

    va_end(argptr); /* Signify end of processing of variable arguments */ 

    fprintf(stderr, buf); /* print the message to stderr */ 

    exit(-1); 
} 

典型的調用將

 
panic("The file %s was not found\n", file_name); /* assume file_name is "foobar" */ 
/* Output would be: 

The file foobar was not found 

*/ 

希望這有助於 最好的問候, 湯姆。

+0

我以爲我試過這個,但現在它工作。非常感謝。 – Totonga 2010-02-01 15:11:15

+1

你的例子很危險。 'vsprintf'不能防止緩衝區溢出,如果'buf'包含嵌入的'%'字符,'fprintf(stderr,buf)'會要求格式化字符串攻擊。你應該使用'vsnprintf'和'fprintf(stderr,「%s」,buf)''或'fputs(buf,stderr)'。 – jamesdlin 2010-02-01 20:36:38

+1

@Jamesdlin:這是一個例子,說明代碼和語義,但你的觀察是正確的......謝謝! :) – t0mm13b 2010-02-01 21:11:25

2

通常會調用一個函數的變量args版本,該版本接受va_list。例如_snwprintf內部調用_vsnwprintf;嘗試調用它。

5

要使用什麼是vsprintf它接受va_list參數,並有樣品中的鏈接 代碼MSDN上。

編輯: 你應該考慮_vsnprintf這將有助於避免vsprintf將愉快地創建緩衝區溢出問題。

2

其他人已經指出vprintf家族的功能,但這也(毫不奇怪)是由comp.lang.c常見問題回答,如果你想熟悉其他常見問題的條目。 (他們是值得一讀,IMO)

How can I write a function that takes a format string and a variable number of arguments, like printf, and passes them to printf to do most of the work?

+0

我搜索了很長時間,無法自己找出解決方案。可能是因爲我搜索了錯誤的東西/單詞。 – Totonga 2010-02-02 10:04:45

相關問題