%[標誌][寬度][.精度]長度類型
// 例:%-10.2f
// - : 標誌 (左對齊)
// 10 : 寬度 (最小輸出字元寬度)
// .2 : 精度 (小數點後位數 / 字串最大長度)
// f : 類型 (float/double)
題目所問「數據的實際寬度」指數據轉換為字串後實際佔用的字元數 (不含結尾 \0)。
| 情況 | 行為 | 範例 (寬度 5) |
|---|---|---|
| 實際寬度 < 指定寬度 | 預設右對齊,左側補空格 | printf("%5d", 99) → " 99" (3空格+99) |
| 實際寬度 = 指定寬度 | 正常輸出,無填充 | printf("%5d", 12345) → "12345" |
| 實際寬度 > 指定寬度 | 忽略寬度限制,按實際寬度完整輸出 (不會截斷) | printf("%5d", 123456) → "123456" |
printf("ID: %5d | Score: %3d\n", 101, 95); // 右對齊
printf("ID: %-5d | Score: %-3d\n", 101, 95); // 左對齊 (加 - 標誌)
double pi = 3.1415926535;
printf("%.2f\n", pi); // 3.14 (四捨五入)
printf("%10.4f\n", pi); // 寬度10,精度4 → " 3.1416"
char *s = "HelloWorld";
printf("%.5s\n", s); // Hello (精度限制最大長度)
printf("%15.5s\n", s); // 右對齊寬度15,僅顯示前5字元
printf("%-15.5s\n", s); // 左對齊
-:左對齊 (預設右對齊)。+:有號數值強制顯示正負號 (如 +95, -5)。空格:正數前加空格,負數加負號 (對齊正負號位)。#:替代形式 (%#x 輸出 0x..., %#o 輸出 0..., %#f 強制顯示小數點)。0:數值右對齊時,左側補 0 而非空格 (如 %05d → 00099)。注意:若同時有 - 或精度 (整數),0 標誌被忽略。| 修飾符 | 對應類型 | 範例 |
|---|---|---|
| hh | signed char / unsigned char | %hhd, %hhu |
| h | short / unsigned short | %hd, %hu |
| l (ell) | long / unsigned long / double (scanf) | %ld, %lu, %lf |
| ll | long long / unsigned long long | %lld, %llu |
| L | long double | %Lf |
| z | size_t | %zu |
| t | ptrdiff_t | %td |
printf("%lf", d) (等同 %f),但舊標準僅 scanf 需 %lf,printf 用 %f 更通用。printf("%*d", width, val); 寬度由引數傳入。printf("%.*s", max_len, str);。「實際寬度」是數據的固有屬性,「指定寬度」是格式化輸出的最小保證。掌握 寬度.精度 與 標誌 的組合,能輕鬆實現完美對齊的控制檯報表與日誌輸出。