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。
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 位寬
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。
snprintf。printf 易犯。* 動態寬度對應的引數。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。
float (32 位):1 符號位 + 8 指數位(移碼,偏移 127)+ 23 尾數位(隱含前導 1)→ **約 7 位十進制有效數字**。double (64 位):1 + 11(偏移 1023)+ 52 → **約 15-16 位有效數字**。unsigned float/double**,浮點數皆有符號。sprintf 是 C/C++ 字串構建的瑞士刀。掌握 %m.n 寬度精度控制、%.* 動態參數、回傳值累加位移、snprintf 安全版本,並理解浮點數儲存限制,能編寫高效、安全、可移植的格式化代碼。