2012-06-07 57 views
0

的內部工作我使用的sprintf這樣的sprintf

sprintf(cTmpBuf, "%0*lu",targetPrecision,ulFraction); 
此之前

我使用這樣

sprintf(cTmpBuf, "%06lu", ulFraction); 

現在我知道它挑targetPrecision的價值,並把它放到*,但我想要知道它背後發生的內部事情

+0

你想知道它是如何實現的嗎? –

+3

除非我的眼睛在欺騙我,否則兩個電話看起來都一樣?!!! –

+0

是@marcelo cantos –

回答

3

如果你想知道它是如何實現的,那就沒有魔法;這只是使用<stdarg.h>處理的另一個參數。大致來說,這將是這樣的:

prec = -1; 
⋮ 
if (*cp == '*') { 
    prec = va_arg(ap, int); 
    cp++; 
} 
+0

ap採取了我通過的價值,然後應用它? –

+0

它是我所展示的。在看到'*'後,函數決定將下一個參數解釋爲用於指定精度的整數。這可能有助於理解常規參數的處理方式完全相同。例如,如果函數看到'%g',它將執行類似'double d = va_arg(ap,double);/* ...格式化雙... * /'。 –

0

我不知道這是否回答你的問題,但在使用字符串格式化*讓你控制格式寬度。所以在第一次調用時,格式化寬度由targetPrecision的值確定。

在第二次調用中,格式化寬度固定爲6位數。

至於sprintf的實際內部。你可以參考@Marcelo Cantos的回答。

檢查此link的格式參數。