首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 sprintf 格式化詳解:從整數到浮點數的完整控制指南

     編輯:關於C語言

sprintf 是構造格式化字符串的利器,將數據按指定格式寫入字符緩衝區。本文系統講解格式控制符、寬度精度、進制、浮點數、字符/ASCII 碼對照、符號擴展陷阱。

1. 基本語法


int sprintf(char* buffer, const char* format, ...);
// 返回寫入字符數(不含結束符)

2. 整數格式化

3. 符號擴展陷阱(短整數打印十六進制)


short si = -1; // 0xFFFF (16位)
sprintf(buf, "%04X", si); // 輸出 FFFFFFFF (32位) ❌
// 原因:變參函數默認整數提升為 int (32位),符號擴展

// 修正:強制無符號提升
sprintf(buf, "%04X", (unsigned short)si); // 輸出 FFFF ✅
// 或
unsigned short usi = -1;
sprintf(buf, "%04X", usi); // 輸出 FFFF ✅

4. 浮點數格式化

需求格式串示例輸出
十進制%d123
寬度 8,右對齊%8d␣␣␣␣␣123
寬度 8,左對齊%-8d123␣␣␣␣␣
十六進制小寫%x7b
十六進制大寫%X7B
八進制%o173
寬度 8,左對齊,補 0%08X0000007B
需求格式串示例輸出
默認 6 位小數%f3.141593
總寬 10,小數 3 位%10.3f␣␣␣3.142
左對齊%-10.3f3.142␣␣␣
僅指定小數位%.3f3.142

⚠️ 類型匹配:%f 對應 double,傳 int 會導致棧解析錯誤,輸出亂碼。必須轉型 (double)i。

5. 字符與 ASCII 碼對照


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 碼

6. 進階技巧

  • %#x / %#X:自動添加 0x/0X 前綴
  • %p:打印指針地址(實現相關格式)
  • %n:寫入已輸出字符數到對應 int* 參數(安全風險,慎用)

7. 安全替代:snprintf


int snprintf(char* buf, size_t size, const char* fmt, ...);
// 防止緩衝區溢出,C99 標準,必須指定 size

總結

sprintf 功能強大但需謹慎:類型必須匹配、寬度精度靈活控制、補零左對齊常用、短整數打印十六進制必須無符號轉型、浮點數傳整數是大坑。生產代碼請改用 snprintf 或 C++ std::format (C++20) / fmt::format。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved