在無限循環 while(1) 中,需要動態生成遞增的文件名:test1.jpg、test2.jpg、test3.jpg… 用於圖片保存、日誌輪轉等場景。
int i;
for (i = 1; i < 100; i++) {
char outImageName1[32] = {0}; // 足夠容納 "test999999999.jpg"
sprintf(outImageName1, "test%d.jpg", i);
printf("%s\n", outImageName1);
// 實際業務調用
// saveImage(outImageName1, imageData);
}
32 字節足夠應對 int 最大值(10 位數)+ 固定前綴後綴{0} 確保字符串以 \0 結尾,防止殘留數據%d 自動處理整數轉十進制字符串,無需手動拼接sprintf(outImageName1, "test%04d.jpg", i); // test0001.jpg, test0002.jpg...
char filename[64];
time_t now = time(NULL);
struct tm *tm_info = localtime(&now);
strftime(filename, sizeof(filename), "img_%Y%m%d_%H%M%S_", tm_info);
sprintf(filename + strlen(filename), "%04d.jpg", sequence++);
// C11 標準
snprintf(outImageName1, sizeof(outImageName1), "test%d.jpg", i);
// POSIX 線程安全
snprintf(outImageName1, sizeof(outImageName1), "test%d.jpg", i);
| 錯誤代碼 | 問題 | 後果 |
|---|---|---|
char *name = "test.jpg"; name[4] = '1'; | 修改字符串字面量 | 未定義行為,段錯誤 |
sprintf(buf, "test%d.jpg", i); // buf 未分配 | 緩衝區未分配/太小 | 緩衝區溢出,安全漏洞 |
static char name[32]; sprintf(name, ...); // 多線程 | 靜態緩衝區共享 | 數據競爭,文件名錯亂 |
i++ 在 sprintf 參數中 | 副作用順序不定 | 序號跳躍或重複 |
int generate_filename(char *buf, size_t bufsz, const char *prefix,
const char *suffix, int seq) {
return snprintf(buf, bufsz, "%s%d%s", prefix, seq, suffix);
}
atomic_int 或互斥鎖保護序號// Windows 安全字符串函數
#include <strsafe.h>
StringCchPrintfA(outImageName1, 32, "test%d.jpg", i);
// MFC CString 更簡潔
CString strName;
strName.Format(_T("test%d.jpg"), i);
// 轉 char* 時注意編碼:CT2A(strName) 或 strName.GetString()