sprintf 是構造格式化字符串的利器,將數據按指定格式寫入字符緩衝區。本文系統講解格式控制符、寬度精度、進制、浮點數、字符/ASCII 碼對照、符號擴展陷阱。
int sprintf(char* buffer, const char* format, ...);
// 返回寫入字符數(不含結束符)
| 需求 | 格式串 | 示例輸出 |
|---|---|---|
| 十進制 | %d | 123 |
| 寬度 8,右對齊 | %8d | ␣␣␣␣␣123 |
| 寬度 8,左對齊 | %-8d | 123␣␣␣␣␣ |
| 十六進制小寫 | %x | 7b |
| 十六進制大寫 | %X | 7B |
| 八進制 | %o | 173 |
| 寬度 8,左對齊,補 0 | %08X | 0000007B |
| 需求 | 格式串 | 示例輸出 |
|---|---|---|
| 默認 6 位小數 | %f | 3.141593 |
| 總寬 10,小數 3 位 | %10.3f | ␣␣␣3.142 |
| 左對齊 | %-10.3f | 3.142␣␣␣ |
| 僅指定小數位 | %.3f | 3.142 |
⚠️ 類型匹配:%f 對應 double,傳 int 會導致棧解析錯誤,輸出亂碼。必須轉型 (double)i。
for (int i = 32; i < 127; i++) {
printf("[ %c ]: %3d 0x%02X\n", i, i, i);
}
/* 輸出:
[ ]: 32 0x20
[ ! ]: 33 0x21
...
[ ~ ]: 126 0x7E
*/
%c:整數 → 字符%d/%x:字符 → ASCII 碼%#x / %#X:自動添加 0x/0X 前綴%p:打印指針地址(實現相關格式)%n:寫入已輸出字符數到對應 int* 參數(安全風險,慎用)
int snprintf(char* buf, size_t size, const char* fmt, ...);
// 防止緩衝區溢出,C99 標準,必須指定 size
sprintf 功能強大但需謹慎:類型必須匹配、寬度精度靈活控制、補零左對齊常用、短整數打印十六進制必須無符號轉型、浮點數傳整數是大坑。生產代碼請改用 snprintf 或 C++ std::format (C++20) / fmt::format。