2012-11-29 64 views
1

我有一個程序,它從命令行獲取格式字符串,它代表多個輸出文件的文件名的格式。它應該只需要一個單一的整數參數,可以替代生成真正的輸出文件名,我想驗證,當我做輸入檢查。什麼是確定格式字符串在C中期望的參數數目的好方法?如何統計C中格式字符串的參數數目?

+0

如果您不需要'printf'的完整通用性,爲什麼不爲模板使用更簡單的結構,以便您可以輕鬆驗證它? – Barmar

+0

什麼格式的字符串? 'printf'的?你至少可以發佈某種示例嗎? – netcoder

+0

對不起,是的,printf樣式格式字符串。而且,當printf隨時可用來完成我可以想象的任何事情時,我並不想爲解析自定義格式而煩惱。 –

回答

1

的接受參數的數量取決於版本的C庫(例如,在C99加入%a轉換說明)。你可以肯定,這是不大於(即,被除去的所有%%序列之後剩餘%字符的數目)轉義%字符數目加上*字符的數目(其可以是寬度說明)大。

儘管如此,您應該考慮安全問題;如果用戶提供格式說明符%n,則可能導致寫入任意內存位置。在其他情況下,供應例如%f將導致垃圾值被輸出,%s在任意的存儲器內容中,並且甚至與%d說明符相關聯,從而允許用戶提供例如字段寬度。 %255d可能導致緩衝區溢出。考慮一種不同的格式化方案比較聰明替換令牌(可能仍然是%d),但不允許用戶提供printf格式字符串。

+0

C99將是一個很好的選擇,我認爲。 「不超過」可能足以滿足我的需求。 –

+0

我在一個值得信賴的環境中工作,所以我並不是很擔心安全問題,但仍然很好理解。我認爲你是對的我只是用給定的字符串替換我的文件編號。 –

+0

「* ......考慮一種不同的格式化方案會更明智一些,例如替換一個令牌(它仍然可以是%d),但不允許用戶提供printf格式的字符串...... *」是的,是的,是的 - **多**更聰明! – alk