目录
1. printf / fprintf / sprintf 的异同
2. C++20/23 格式化库 (std::format,需编译器支持)
C 语言中的格式化函数对比
1. printf
/ fprintf
/ sprintf
的异同
函数 | 输出目标 | 返回值 | 主要用途 |
---|---|---|---|
printf |
标准输出 (stdout ) |
写入的字符数 | 控制台输出 |
fprintf |
任意文件流 (FILE* ) |
写入的字符数 | 文件或日志写入 |
sprintf |
字符数组 (char[] ) |
写入的字符数 | 内存中构造字符串 |
代码示例:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
const int len = 128;
time_t tx = time(nullptr);
struct tm* p = localtime(&tx);
char buff[len] = {};
fprintf(stdout, "%4d/%02d/%02d/-%02d:%02d:%d\n",
p->tm_year+1900,p->tm_mon+1,
p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
sprintf(buff, "%4d/%02d/%02d/-%02d:%02d:%d\n",
p->tm_year + 1900, p->tm_mon + 1,
p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
cout << buff << endl;
return 0;
}
关键风险: sprintf
无缓冲区越界检查,若格式化后的字符串长度超过 buff
的大小会导致缓冲区溢出。 ✅ 安全改进: 使用 snprintf
指定最大写入长度:
snprintf(buff, len