`sprintf` 將格式化數據寫入字符串緩衝區,`%Nd` 中的數字 `N` 指定最小寬度,不足左側填充空格,超出不截斷。
#include <stdio.h>
int main() {
char str[20];
int a = 20984, b = 48090;
sprintf(str, "%3d%6d", a, b);
printf("%s\n", str);
return 0;
}
輸出:20984 48090
│ │
│ └─ b=48090 (5位數) → %6d 左填1空格 → " 48090"
└─ a=20984 (5位數) → %3d 寬度不足 → 不填充 → "20984"
實際字符串內容:`"20984 48090"` (中間有 1 個空格)
%[標誌][寬度][.精度][長度]類型
| 組件 | 說明 | 示例 |
|---|---|---|
| 標誌 | `-` 左對齊、`+` 顯示符號、空格 正數前空格、`0` 零填充、`#` 替代形式 | `%-6d` 左對齊 |
| 寬度 | 最小字符數,不足填充 | `%6d` |
| 精度 | 小數位數 / 最大字符數 | `%.2f`、`%.5s` |
| 長度 | `hh` `h` `l` `ll` `j` `z` `t` `L` | `%lld` `long long` |
| 類型 | `d/i` `u` `o` `x/X` `f/F` `e/E` `g/G` `a/A` `c` `s` `p` `n` | `%d` 有符號十進制 |
sprintf(buf, "%05d", 42); // "00042" 零填充
sprintf(buf, "%-10s", "hello"); // "hello " 左對齊
sprintf(buf, "%+d", 42); // "+42" 強制符號
sprintf(buf, "%#x", 255); // "0xff" 替代形式
sprintf(buf, "%*.*d", 6, 3, 42); // 寬度精度由參數指定 → " 042"
int snprintf(char *buf, size_t size, const char *fmt, ...);
// 保證不超過 size-1 字符,自動添加 \0,返回需寫入字符數 (不含 \0)
永遠優先使用 `snprintf`,防止緩衝區溢出。
int len = snprintf(buf, sizeof(buf), "Item %d: %.2f", id, price);
if (len >= sizeof(buf)) {
// 截斷發生,緩衝區太小
}