格式化字符串中轉換說明格式:%[flags][fldwidth][.precision][len]type。本文重點剖析 域寬度 與 精度 的交互規則。
0 標誌),超寬不截斷。float f = 5223.3324;
int i = 30000;
char *s = "Hello,World!";
printf("%11.3f\n", f); // 輸出: " 5223.332" (寬11, 保留3位小數)
printf("%11.8d\n", i); // 輸出: "000030000" (寬11, 整數至少8位, 前補0)
printf("%11.8s\n", s); // 輸出: " Hello,Wo" (寬11, 字串最多8字符, 截斷後左對齊)

代碼中 5223.3324 以 %.3f 輸出理論為 5223.332,但實測得 5223.333。原因在於 5223.3324 無法精確用二進制浮點表示,實際存儲值略大於 5223.3324,四捨五入時進位。浮點數輸出四捨五入基於實際存儲的二進制近似值,而非十進制字面值。
%08d:寬度 8,前補 0(等同 %8.8d)。%-10.5s:寬度 10 左對齊,最多 5 字符。%*.*s:寬度與精度由參數動態指定。| 類型 | fldwidth | precision |
|---|---|---|
| 整數 | 最小總寬(含符號) | 最小數字位數(前補0) |
| 浮點數 | 最小總寬(含小數點符號) | 小數點後位數(四捨五入) |
| 字符串 | 最小總寬 | 最大字符數(截斷) |
精通 fldwidth 與 precision,能生成整齊對齊的表格、報表與日志,是 C 程序員必備基本功。