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

C/C++ sprintf 完整使用指南:格式化、浮點數控制、字串連接、位址輸出與回傳值技巧

     編輯:關於C語言

sprintf 基礎原型

int sprintf(char* buffer, const char* format, ...);
  • 將格式化結果寫入 buffer,**回傳寫入字元數(不含結束符 \0)**。
  • format 含 % 開頭的格式說明符,對應後續變參。

常用格式化場景

整數格式化

sprintf(s, "%d", 123);           // "123"
sprintf(s, "%8d%8d", 123, 4567); // "     123    4567" (右對齊寬度 8)
sprintf(s, "%-8d%8d", 123, 4567); // "123     4567" (左對齊)
sprintf(s, "%08X", 4567);        // "000011D7" (16 進制大寫,前導 0,寬度 8)

浮點數精確控制

sprintf(s, "%f", 3.1415926);      // "3.141593" (預設 6 位小數)
sprintf(s, "%10.3f", 3.1415926);  // "    3.142" (總寬 10,小數 3 位)
sprintf(s, "%-10.3f", 3.1415926); // "3.142    " (左對齊)
sprintf(s, "%.3f", 3.1415926);    // "3.142" (不指定總寬)

陷阱:sprintf(s, "%.2f", 100) **錯誤**!%f 對應 double,傳 int 導致堆疊解讀錯誤。
**正確**:sprintf(s, "%.2f", (double)100) 或 100.0。

字元/ASCII 碼對照

sprintf(s, "%c %d 0x%02X", 'A', 'A', 'A'); // "A 65 0x41"
for (int i=32; i<127; i++) printf("[%c]: %3d 0x%02X\n", i, i, i);

字串連接與截取

char* who = "I", *whom = "你";
sprintf(s, "%s love %s.", who, whom); // "I love 你."

// 非結尾 \0 的字元陣列連接(指定最大長度)
char a1[] = {'A','B','C','D','E','F','G'};
char a2[] = {'H','I','J','K','L','M','N'};
sprintf(s, "%.7s%.7s", a1, a2); // "ABCDEFGHIJKLMN"

// 動態長度
sprintf(s, "%.*s%.*s", 7, a1, 7, a2); // 同上,* 佔位寬度/精度

位址輸出

int i;
sprintf(s, "%p", &i);        // 標準位址格式(編譯器實作定義)
sprintf(s, "%08X", (unsigned)&i); // 手動 16 進制 8 位寬

進階技巧:利用回傳值避免 strlen

char buf[256];
int offset = 0;
for (int i=0; i<10; i++) {
    offset += sprintf(buf + offset, "%d,", rand() % 100);
}
buf[offset-1] = '\n'; // 替換最後逗號
printf("%s", buf);

每次 sprintf 回傳寫入長度,直接累加 offset,**無需呼叫 strlen 尋找結尾**,效率遠優於 strcat。

常見錯誤避坑

  1. 緩衝區過小:預留足夠空間或用 snprintf。
  2. 漏寫第一個參數:習慣 printf 易犯。
  3. 變參對應錯誤:格式符與引數數量/型別不符,特別是 * 動態寬度對應的引數。

姊妹函數:strftime 格式化時間

time_t t = time(nullptr);
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
// 產生 "2024-01-15 14:30:05"

MFC 對應:CString::Format、CTime::Format。

浮點數儲存標準補充(IEEE 754)

  • float (32 位):1 符號位 + 8 指數位(移碼,偏移 127)+ 23 尾數位(隱含前導 1)→ **約 7 位十進制有效數字**。
  • double (64 位):1 + 11(偏移 1023)+ 52 → **約 15-16 位有效數字**。
  • 指數全 1 (0xFF/0x7FF) 表示無窮大/NaN;指數全 0 表示非正規化數/零。
  • 無 unsigned float/double**,浮點數皆有符號。

總結

sprintf 是 C/C++ 字串構建的瑞士刀。掌握 %m.n 寬度精度控制、%.* 動態參數、回傳值累加位移、snprintf 安全版本,並理解浮點數儲存限制,能編寫高效、安全、可移植的格式化代碼。

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