2013-06-12 67 views
0

我正在嘗試創建一個簡單的模板引擎,引擎 ,它接受一個模式和一些變量並生成一個字符串輸出。 這是想法:如何用數組調用printf?

const char * pattern = ReadPattern(); // pattern is like "%s in %s ft" 
vector<const char *> variable = ReadVariable(); // variable is like "6", "5". 

我怎麼能說與他們printf函數? 理想情況下,我可以做printf(pattern, variable[0], variable[1]); 但是,因爲模式和變量直到運行時才知道,我甚至不知道變量的數量。 據我的理解,編程構建一個va_list是一個不可移植的。

請幫忙,謝謝!

+0

http://stackoverflow.com/questions/988290/populating-a-va-list – ctn

+0

但是「populate-a-va-list」的最佳答案是「這是一個壞主意......」 – yufanyufan

+0

生成printf()的運行時模式很可能是一個非常糟糕的主意。這通常會導致安全問題。請參閱https://en.wikipedia.org/wiki/Uncontrolled_format_string – kpaleniu

回答

1

如果您對vector元素的數量有上限,則它是相對直接的。假設上限是3:

int printf_vector(const char *p, vector<const char *> v) { 
    switch (v.size()) { 
    case 0: return printf(p); 
    case 1: return printf(p, v[0]); 
    case 2: return printf(p, v[0], v[1]); 
    case 3: return printf(p, v[0], v[1], v[2]); 
    default: break; 
    } 
    return -E2BIG; 
} 

如果您有沒有上限,然後this is a bad idea

+1

理論上,您可以查看代碼的彙編輸出,並找出如何編寫內聯彙編循環以將向量元素推送到堆棧並調用'printf'。 – jxh