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

sprintf 函數完全指南:格式化字串構建、數值轉字串、寬度精度控制實戰

     編輯:關於C語言

函數原型

int sprintf(char *buffer, const char *format, ...);

將格式化數據寫入字符數組 buffer,返回寫入字節數(不含結束符 \0)。

核心用法示例

char buffer[200];

// 1. 字串拼接(指定最大寬度)
char a1[] = "ABCDEFG", a2[] = "HIJKLMN";
sprintf(buffer, "%.*s%.*s\n", sizeof(a1), a1, sizeof(a2), a2);
// %.*s:寬度由對應參數動態指定

// 2. 多類型數據格式化到同一 buffer
char str[] = "computer"; char c = 'L';
int i = 35; float fp = 1.7320534f;
int j = 0;
j += sprintf(buffer + j, "String:%s", str);
j += sprintf(buffer + j, "Character:%c", c);
j += sprintf(buffer + j, "Integer:%d", i);
j += sprintf(buffer + j, "Real:%f", fp);  // 累加偏移量實現追加

// 3. 數值格式化(替代 itoa)
short m = -1; int n = 100;
sprintf(buffer, "%-4d%4d", 123, 4567);     // "123 4567" 左對齊
sprintf(buffer, "%08x", 4567);             // "000011d7" 16進制左補0
sprintf(buffer, "%#04X", (unsigned short)m); // "0xFFFF" 無符號短整型
sprintf(buffer, "%.2f", (double)n);        // "100.00" 保留2位小數

格式控制符深度解析

格式含義範例輸出
%m.ns字串:寬度 m,最多取 n 字符%5.3s → " ab"
%.*s寬度/精度由參數動態傳入sprintf(buf, "%.*s", 3, "hello") → "hel"
%-md左對齊,寬度 m,右補空格%-5d → "123 "
%0md右對齊,寬度 m,左補 0%05d → "00123"
%#x/%#X16進制帶 0x/0X 前綴%#x → "0x1f"
%.nf浮點數保留 n 位小數%.2f → "3.14"

關鍵注意事項

  1. 緩衝區溢位風險:sprintf 不檢查長度,生產環境建議用 snprintf。
  2. 變參類型安全:%X 對應 unsigned int,傳 short 需強轉 (unsigned short),否則符號擴展導致錯誤輸出(如 -1 → FFFFFFFF)。
  3. 返回值:寫入字節數,\0 不計入。可用於追加寫入偏移計算。
  4. 安全替代:C11 sprintf_s、snprintf 提供邊界檢查。

總結

sprintf 是 C 語言構建格式化字串的瑞士軍刀,掌握動態寬度/精度、對齊填充、進制前綴、浮點精度等技巧,能極大簡化字串處理代碼。務必養成緩衝區大小檢查習慣,避免安全隱患。

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