2012-11-15 38 views
2

我有一種情況,我試圖打印出由Lua中的用戶格式化並通過註冊函數發送給我的信息。我從客戶處得到的是一個格式字符串,參數的數量和每個參數的數字。在調用這個函數之前,我不知道用戶有多少個參數。我通過查詢lua系統得到它們。在C中使用printf,直到運行時才知道有多少個參數

如何在運行時使用格式字符串和數字列表調用printf?我可以在運行時爲數字的值分配一個數組,但printf期望va_list不是參數的數字數組。

我可以根據參數的數量得到大量的'if'語句,但我一直在尋找一種滑溜的方式。

任何想法?

+0

循環遍歷函數中的列表並追加到前一個printf ?. –

+0

嘗試vprintf。 IIRC它與數組一起工作 – fuz

回答

1

如果你只需要打印出你可以使用for循環來遍歷所有值並單獨打印它們的值,只需要而不是換行符。

+2

由於printf緩衝區,你不會遭受任何性能缺乏。 – tomahh

+0

這通常會正常工作,但在這種情況下,用戶將要以不同的方式格式化每個數字(第一個數字小數點後6位,下一個數字小數點後6位數等) –

+0

如果您知道,爲什麼會出現問題事先......? –

0

我認爲,在循環內重複調用printf,顯然會運行「參數數量」次。我的意思是這樣說:

void YourFunction(char *format, int number_of_arguments, int *arguments) 
{ 
    for(int index = 0; index < number_of_arguments; index++) 
    { 
     printf(format, arguments[index]); 
    } 
} 

現在你可以格式化你想要的方式,比如通過做添加換行符,

strcat(format, "\n"); 

糾正我,如果我誤解你的問題。

+1

他希望YourFunction()發出printf(格式,參數[0],參數[1],...),即用編譯時未知的多個參數調用printf,不要爲每個參數重複調用printf 。 –

1

我認爲你可以使用一個打印%s的printf,並將你的函數作爲參數傳遞給char *。該函數將接受參數數組作爲參數。內部函數可以使用sprintf將所有參數格式化爲「字符串」,並在結束時返回創建的「字符串」。

相關問題